W3docs

error_get_last()

Scopri la funzione error_get_last() di PHP: cosa restituisce, quando è null e come usarla correttamente nella gestione degli errori.

La gestione degli errori è una parte fondamentale della programmazione in PHP, poiché gli errori possono verificarsi in qualsiasi momento durante l'esecuzione. La funzione error_get_last() è una funzione PHP integrata che consente di esaminare l'errore più recente registrato da PHP — il suo tipo, messaggio, file e riga — in modo da poterlo registrare o gestire nel codice. Questo capitolo spiega cosa restituisce la funzione, quando restituisce null, i tipi di errori che acquisisce e quelli che non acquisisce, e come usarla correttamente in PHP moderno.

Cosa restituisce error_get_last()

error_get_last() non accetta argomenti e restituisce informazioni sull'ultimo errore generato da PHP durante la richiesta corrente. Il valore restituito è uno di due possibili:

  • Un array associativo con quattro chiavi, se si è verificato un errore.
  • null, se non è stato ancora registrato alcun errore.

L'array ha la seguente struttura:

[
  'type'    => 2,                       // int: the error level (E_WARNING here)
  'message' => 'fopen(...): ...',       // string: the error description
  'file'    => '/path/to/script.php',   // string: file where the error happened
  'line'    => 12,                      // int: line number where it happened
]

L'elemento type è un intero corrispondente a una delle costanti di livello di errore di PHP — ad esempio E_WARNING (2), E_NOTICE (8), E_USER_WARNING (512), o E_DEPRECATED. Consulta il riferimento agli errori PHP per l'elenco completo.

Cosa acquisisce e cosa non acquisisce

Questo è il punto in cui le persone si sbagliano più spesso, quindi vale la pena essere precisi:

  • Acquisisce errori segnalati, avvisi, notifiche e deprecazioni — tutto ciò che passa attraverso il normale meccanismo di errore di PHP, inclusi quelli generati con trigger_error().
  • Non acquisisce le eccezioni. In PHP moderno (7.0+), molti errori generano eccezioni invece di segnalare errori — ad esempio, la divisione e il modulo per zero lanciano DivisionByZeroError, non un avviso. Questi devono essere gestiti con try/catch, e error_get_last() non li intercetterà.
  • Vede solo gli errori che vengono effettivamente segnalati. Se un livello di errore è filtrato da error_reporting(), non apparirà. Abilita error_reporting(E_ALL) durante il debug in modo che nulla venga eliminato silenziosamente.

Per questo motivo, error_get_last() è più utile subito dopo una funzione integrata che segnala un errore tramite un avviso (come fopen(), file_get_contents(), o unlink()), e all'interno di una funzione di shutdown personalizzata per catturare un errore fatale che ha terminato la richiesta.

Esempi

Leggere l'ultimo avviso da un fopen() fallito

Funzioni come fopen() restituiscono false e generano un E_WARNING quando falliscono. L'operatore @ sopprime la stampa dell'avviso, pur permettendo a error_get_last() di leggerlo:

<?php
error_reporting(E_ALL);

$handle = @fopen("/no/such/file.txt", "r");

if ($handle === false) {
    $error = error_get_last();
    echo "Type:    " . $error['type']    . "\n";
    echo "Message: " . $error['message'] . "\n";
    echo "Line:    " . $error['line']    . "\n";
}
?>

Output:

Type:    2
Message: fopen(/no/such/file.txt): Failed to open stream: No such file or directory
Line:    4

Il valore di type è 2, che corrisponde al valore della costante E_WARNING, e il messaggio proviene direttamente da fopen().

Acquisire un errore generato manualmente

Puoi registrare un tuo errore con trigger_error() e poi rileggerlo:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '0');

trigger_error("Invalid configuration value", E_USER_WARNING);

$error = error_get_last();
echo "Message: " . $error['message'] . "\n";
echo "Type:    " . $error['type'] . "\n"; // 512 = E_USER_WARNING
?>

Output:

Message: Invalid configuration value
Type:    512

Quando non si è verificato alcun errore

Se non è ancora andato nulla storto, la funzione restituisce null, quindi verifica sempre prima di leggere le chiavi dell'array:

<?php
$error = error_get_last();

var_dump($error); // NULL — guard against this before using $error['message']
?>

Output:

NULL

Errori comuni

  • Controlla sempre che il risultato non sia null (if ($error !== null)) prima di accedere a $error['message'], altrimenti attiverai un nuovo avviso "trying to access array offset on null".
  • La divisione per zero non è più un avviso. Usa try/catch per DivisionByZeroError; error_get_last() non lo segnalerà.
  • Per la registrazione programmatica invece dell'ispezione, considera di abbinare questa funzione con error_log() o un handler personalizzato registrato tramite set_error_handler().

Conclusione

error_get_last() fornisce il tipo, il messaggio, il file e la riga dell'errore più recente registrato da PHP, oppure null se non ce n'è stato nessuno. Usala subito dopo una funzione integrata che fallisce con un avviso, o all'interno di una funzione di shutdown — e ricorda che le eccezioni (inclusa la divisione per zero moderna) richiedono invece try/catch.

Pratica

Pratica
Cosa fa la funzione error_get_last() in PHP?
Cosa fa la funzione error_get_last() in PHP?
Was this page helpful?