Errori PHP
Guida ai livelli di errore PHP, alle costanti E_*, alla differenza tra errori ed eccezioni e alle best practice per gestirli.
Incontrare errori è una parte normale della scrittura di codice PHP. Prima riesci a leggere un errore e a capire a quale livello appartiene, perché PHP lo ha generato e come rispondervi, prima potrai distribuire codice funzionante. Questa pagina spiega i livelli di errore di PHP (le costanti E_*), la differenza tra errori ed eccezioni nel PHP moderno, e un flusso di lavoro pratico per segnalarli, registrarli e gestirli.
Livelli di errore PHP
Quando PHP rileva un problema, lo segnala a un livello specifico, identificato da una costante E_*. Il livello indica la gravità del problema e se lo script continua l'esecuzione. Queste costanti si combinano con error_reporting() e la direttiva error_reporting di php.ini per decidere quali livelli vengono mostrati o registrati.
| Costante | Blocca lo script? | Significato |
|---|---|---|
E_ERROR | Sì | Errore fatale a runtime, ad es. chiamata a una funzione non definita. |
E_WARNING | No | Avviso a runtime, ad es. include di un file mancante. |
E_PARSE | Sì | Errore di sintassi in fase di compilazione; il file non viene mai eseguito. |
E_NOTICE | No | Problema minore, ad es. lettura di una variabile non definita. |
E_DEPRECATED | No | La funzionalità funziona ancora ma verrà rimossa in una versione futura. |
E_USER_ERROR / E_USER_WARNING / E_USER_NOTICE | Variabile | Livelli che puoi generare tu stesso con trigger_error(). |
E_STRICT | No | Suggerimenti per codice compatibile con le versioni future (incluso in E_ALL da PHP 7). |
E_ALL | — | Bitmask che abilita tutti i livelli — usalo in sviluppo. |
Queste sono costanti bitmask, quindi si combinano con l'operatore OR bit a bit (|) e si escludono livelli con & e ~:
<?php
// Report everything except notices and deprecations
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);Importante: A partire da PHP 8.0 molti ex warning e notice sono stati promossi a eccezioni
Errorlanciate (ad esempio, leggere una chiave di array non definita genera ora un avviso, mentre chiamare un metodo non definito lancia unError). Sapere se un problema è un errore sollevato o un'eccezione lanciata determina come catturarlo — vedere di seguito.
Errori vs. Eccezioni
PHP ha due meccanismi correlati ma separati:
- Gli errori tradizionali vengono sollevati dal motore e instradati tramite
error_reporting,display_errorse un gestore opzionale impostato conset_error_handler(). Non sono oggetti che puoicatch(a meno che il tuo gestore non li converta). - Le eccezioni sono oggetti che si
throwe sicatchcon blocchitry/catch. Da PHP 7, anche i problemi fatali del motore vengono lanciati come oggettiError(comeTypeErroroDivisionByZeroError), e siaExceptioncheErrorimplementano l'interfacciaThrowable— quindicatch (\Throwable $e)cattura qualsiasi cosa intercettabile.
<?php
try {
// intdiv() throws a DivisionByZeroError on division by zero
echo intdiv(10, 0);
} catch (\Throwable $e) {
echo get_class($e) . ": " . $e->getMessage();
}
// Output: DivisionByZeroError: Division by zeroCause Comuni degli Errori PHP
La maggior parte degli errori risale a un insieme ristretto di cause:
- Errori di sintassi — un punto e virgola mancante o una parentesi non corrispondente (
E_PARSE). - Simboli non definiti — utilizzo di una variabile, costante, funzione o chiave di array che non esiste.
- Incompatibilità di tipo — passaggio del tipo sbagliato a un parametro tipizzato (lancia
TypeError). - Funzionalità deprecate — funzioni o sintassi destinate alla rimozione (
E_DEPRECATED). - Limiti di risorse — esaurimento del
memory_limito raggiungimento delmax_execution_time. - Errori esterni — un file mancante, o una connessione a database/API che rifiuta o va in timeout.
- Eccezioni non catturate — un
throwsenza uncatchcorrispondente, che diventa un errore fatale.
<?php
// Reading an undefined variable raises an E_WARNING and yields null
echo $undefined_variable ?? "fallback";
// Output: fallbackL'operatore null-coalescing (??) nell'esempio sopra è il modo idiomatico per leggere un valore che potrebbe essere non definito senza generare un avviso.
Configurazione della Segnalazione degli Errori
Controlla quali livelli emergono e dove vengono inviati. In sviluppo, mostra tutto; in produzione, nascondi gli errori agli utenti ma registrali.
<?php
// Development: show all errors on screen
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Production: hide from users, write to the error log instead
// error_reporting(E_ALL);
// ini_set('display_errors', '0');
// ini_set('log_errors', '1');Le impostazioni equivalenti di php.ini sono error_reporting, display_errors, log_errors ed error_log. Per il controllo programmatico vedi error_reporting() e per ispezionare l'errore più recente usa error_get_last().
Gestione degli Errori nel Codice
Ci sono tre strumenti complementari:
1. Cattura le eccezioni con try/catch in modo che un errore recuperabile non blocchi lo script:
<?php
function safeDivide(int $a, int $b): float
{
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
try {
echo safeDivide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Handled: " . $e->getMessage();
}
// Output: Handled: Cannot divide by zero2. Installa un gestore di errori personalizzato con set_error_handler() per convertire gli errori tradizionali in eccezioni o per registrarli nel tuo formato:
<?php
set_error_handler(function (int $level, string $message, string $file, int $line) {
// Turn a traditional warning/notice into an ErrorException so it can be caught
throw new ErrorException($message, 0, $level, $file, $line);
});
try {
// Reading a missing file raises an E_WARNING, now converted to an exception
$contents = file_get_contents('/no/such/file.txt');
} catch (\Throwable $e) {
echo "Caught: " . $e->getMessage();
}
// Output: Caught: file_get_contents(/no/such/file.txt): Failed to open stream: No such file or directory3. Genera i tuoi errori con trigger_error() per segnalare problemi a livello applicativo attraverso la stessa pipeline degli errori del motore.
Best Practice
- Imposta
display_errorsa0in produzione — i stack trace esposti sono un rischio per la sicurezza. Usa invecelog_errorse unerror_logconfigurato. - Sviluppa con
error_reporting(E_ALL)in modo che notice e deprecation emergano presto. - Preferisci
catch (\Throwable $e)al livello superiore per catturare siaExceptioncheError. - Non silenziare mai i problemi con l'operatore
@; correggi la causa o gestiscila esplicitamente. - Centralizza la registrazione con
error_log()in modo che ogni errore finisca in un unico posto.
Conclusione
Leggere un errore PHP inizia dal suo livello e dal fatto che si tratti di un errore sollevato o di un'eccezione lanciata. Con error_reporting() calibrato per ambiente, un gestore personalizzato che convoglia gli errori nel sistema delle eccezioni, e try/catch attorno al codice che può fallire, puoi diagnosticare i problemi rapidamente e mantenere la produzione resiliente. Continua con PHP Exceptions e error_reporting() per approfondire.