PERCHÉ STA SUCCEDENDO?
Nel tempo, PHP è diventato un linguaggio più incentrato sulla sicurezza. Le impostazioni che erano disattivate per impostazione predefinita ora sono attivate per impostazione predefinita. Un esempio perfetto di questo è E_STRICT
, che è diventato attivo di default a partire da PHP 5.4.0 .
Inoltre, secondo la documentazione di PHP, per impostazione predefinita, E_NOTICE
è disabilitato in php.ini. I documenti PHP consigliano di attivarlo per scopi di debug . Tuttavia, quando scarico PHP dal repository Ubuntu - e dallo stack di Windows di BitNami - vedo qualcos'altro.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Si noti che in error_reporting
realtà è impostato sul valore di produzione per impostazione predefinita, non sul valore "predefinito" per impostazione predefinita. Questo è un po 'confuso e non è documentata al di fuori di php.ini, così ho non convalidato questo su altre distribuzioni.
Per rispondere alla tua domanda, tuttavia, questo errore viene visualizzato ora quando non è stato visualizzato prima perché:
Hai installato PHP e le nuove impostazioni predefinite sono in qualche modo scarsamente documentate ma non le escludono E_NOTICE
.
E_NOTICE
avvisi come variabili indefinite e indici indefiniti aiutano effettivamente a rendere il codice più pulito e sicuro. Posso dirti che, anni fa, mantenere E_NOTICE
abilitato mi ha costretto a dichiarare le mie variabili. Ha reso MOLTO più facile da imparare in C, se non dichiarare le variabili è molto più fastidioso.
Cosa posso fare al riguardo?
Disattiva E_NOTICE
copiando il "Valore predefinito" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
e sostituendolo con ciò che è attualmente non commentato dopo l'accesso uguale error_reporting =
. Riavvia Apache o PHP se usi CGI o FPM. Assicurati di modificare il "giusto" php.ini. Quello corretto sarà Apache se si esegue PHP con Apache, fpm o php-fpm se si esegue PHP-FPM, cgi se si esegue PHP-CGI, ecc. Questo non è il metodo consigliato, ma se si dispone di un codice legacy che sta per essere estremamente difficile da modificare, quindi potrebbe essere la soluzione migliore.
Disattiva E_NOTICE
a livello di file o cartella. Questo potrebbe essere preferibile se hai un codice legacy ma vuoi fare le cose nel modo "giusto" altrimenti. Per fare ciò, dovresti consultare Apache2, Nginx o qualunque sia il tuo server preferito. In Apache, useresti php_value
all'interno di <Directory>
.
Riscrivi il tuo codice per essere più pulito. Se devi farlo mentre ti sposti in un ambiente di produzione o non vuoi che qualcuno veda i tuoi errori, assicurati di disabilitare qualsiasi visualizzazione degli errori e di registrare solo i tuoi errori (vedi display_errors
e log_errors
in php.ini e le impostazioni del tuo server) .
Espandere sull'opzione 3: questo è l'ideale. Se puoi seguire questa strada, dovresti. Se inizialmente non stai seguendo questa strada, considera di spostarla alla fine testando il codice in un ambiente di sviluppo. Mentre ci sei, sbarazzati di ~E_STRICT
e ~E_DEPRECATED
vedere cosa potrebbe andare storto in futuro. Vedrai MOLTI errori sconosciuti, ma ti impedirà di avere problemi spiacevoli quando dovrai aggiornare PHP in futuro.
COSA SIGNIFICANO GLI ERRORI?
Undefined variable: my_variable_name
- Ciò si verifica quando una variabile non è stata definita prima dell'uso. Quando lo script PHP viene eseguito, internamente assume solo un valore nullo. Tuttavia, in quale scenario dovresti controllare una variabile prima che fosse definita? In definitiva, questo è un argomento per "codice sciatto". Come sviluppatore, posso dirti che mi piace quando vedo un progetto open source in cui le variabili sono definite in alto nei loro ambiti come possono essere definite. Rende più facile dire quali variabili verranno visualizzate in futuro e facilita la lettura / apprendimento del codice.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Ciò si verifica quando si tenta di accedere a un valore in un array e non esiste. Per evitare questo errore, eseguire un controllo condizionale.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Un'altra opzione è dichiarare un array vuoto nella parte superiore della funzione. Questo non è sempre possibile.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(suggerimento aggiuntivo)
- Quando ho riscontrato questi e altri problemi, ho usato NetBeans IDE (gratuito) e mi ha dato una serie di avvisi e avvisi. Alcuni offrono suggerimenti molto utili. Questo non è un requisito e non uso più gli IDE, tranne che per progetti di grandi dimensioni. Sono più una
vim
persona in questi giorni :).