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 contry/catch, eerror_get_last()non li intercetterà. - Vede solo gli errori che vengono effettivamente segnalati. Se un livello di errore è filtrato da
error_reporting(), non apparirà. Abilitaerror_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: 4Il 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: 512Quando 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:
NULLErrori 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/catchperDivisionByZeroError;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 tramiteset_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.