Per coloro che sono interessati, ho ampliato questo argomento in un piccolo articolo, che fornisce le seguenti informazioni in una forma strutturata un po 'meglio: The Definitive Guide To PHP's isset And empty
IMHO dovresti pensare non solo a rendere l'app "compatibile E_NOTICE", ma a ristrutturare il tutto. Avere centinaia di punti nel codice che tentano regolarmente di utilizzare variabili inesistenti suona come un programma strutturato piuttosto male. Il tentativo di accedere a variabili inesistenti non dovrebbe mai accadere, altri linguaggi esitano in questo momento della compilazione. Il fatto che PHP ti permetta di farlo non significa che dovresti.
Questi avvertimenti sono lì per aiutarti , non per infastidirti. Se ricevi un avviso "Stai cercando di lavorare con qualcosa che non esiste!" , la tua reazione dovrebbe essere "Oops, colpa mia, lasciami risolvere il problema il prima possibile." In quale altro modo saprai la differenza tra "variabili che funzionano bene indefinite" e codice onestamente sbagliato che può portare a gravi errori ? Questo è anche il motivo per cui sviluppi sempre, sempre , con la segnalazione degli errori impostata su 11 e continui a collegare il tuo codice fino a quando non un singoloNOTICE
viene rilasciato. La disattivazione della segnalazione degli errori è solo per gli ambienti di produzione, per evitare la perdita di informazioni e fornire una migliore esperienza utente anche di fronte a codice difettoso.
Elaborare:
Avrai sempre bisogno isset
o empty
da qualche parte nel tuo codice, l'unico modo per ridurne l'occorrenza è inizializzare correttamente le tue variabili. A seconda della situazione ci sono diversi modi per farlo:
Argomenti della funzione:
function foo ($bar, $baz = null) { ... }
Non è necessario controllare se $bar
o $baz
sono impostati all'interno della funzione perché li hai semplicemente impostati, tutto ciò di cui devi preoccuparti è se il loro valore restituisce true
o false
(o qualsiasi altra cosa).
Variabili regolari ovunque:
$foo = null;
$bar = $baz = 'default value';
Inizializza le tue variabili all'inizio di un blocco di codice in cui le userai. Ciò risolve il !isset
problema, garantisce che le variabili abbiano sempre un valore predefinito noto, dà al lettore un'idea di ciò su cui funzionerà il codice seguente e quindi serve anche come una sorta di auto-documentazione.
Array:
$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);
Come sopra, stai inizializzando l'array con i valori predefiniti e sovrascriverli con i valori effettivi.
Negli altri casi, diciamo un modello in cui stai emettendo valori che possono o non possono essere impostati da un controller, dovrai solo controllare:
<table>
<?php if (!empty($foo) && is_array($foo)) : ?>
<?php foreach ($foo as $bar) : ?>
<tr>...</tr>
<?php endforeach; ?>
<?php else : ?>
<tr><td>No Foo!</td></tr>
<?php endif; ?>
</table>
Se ti array_key_exists
accorgi di usarlo regolarmente , dovresti valutare per cosa lo stai usando. L'unica volta che fa la differenza è qui:
$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true
Come affermato sopra, tuttavia, se stai inizializzando correttamente le tue variabili, non è necessario controllare se la chiave esiste o meno, perché sai che lo fa. Se stai ricevendo l'array da una sorgente esterna, il valore sarà molto probabilmente non sarà null
, ma ''
, 0
, '0'
, false
o qualcosa di simile, cioè un valore che si può valutare con isset
o empty
, a seconda del vostro intento. Se si imposta regolarmente una chiave di matrice su null
e si desidera che abbia un significato diverso false
, cioè se nell'esempio precedente i risultati diversi isset
e array_key_exists
fanno la differenza per la logica del programma, è necessario chiedersi il motivo. La semplice esistenza di una variabile non dovrebbe essere importante, solo il suo valore dovrebbe essere di conseguenza. Se la chiave è un flag true
/ false
, usatrue
oppure false
no null
. L'unica eccezione a questo sarebbe le librerie di terze parti che vogliono null
significare qualcosa, ma poiché null
è così difficile da rilevare in PHP, devo ancora trovare alcuna libreria che lo faccia.