2012-04-09 5 views
5

Ho pensato di utilizzare l'assegnazione di riferimento come scorciatoia per gestire variabili potenzialmente non definite.È una cattiva pratica utilizzare l'assegnazione di riferimento in PHP quando si gestiscono variabili potenzialmente indefinite?

In altre parole, invece di:

$foo = isset($this->blah['something']['else']) ? $this->blah['something']['else'] : null; 
if (!is_null($foo) && ...){ 
    //do something with $foo 
} 

avrei potuto fare questo:

$foo = &$this->blah['something']['else']; 
if (!is_null($foo) && ...){ 
    //do something with $foo 
} 

Sembra semplice, giusto? A causa del modo in cui PHP gestisce l'assegnazione per riferimento, non devo preoccuparmi di $ this-> blah ['something'] ['else'] in fase di definizione, perché se non esiste verrà creato automaticamente e impostato a NULL.

Questa strategia è disapprovata?

+0

direi che è stata una cattiva pratica. Mi aspetto che il secondo modulo sollevi un avviso a prescindere dall'operatore di riferimento, e le comunicazioni dovrebbero essere schiacciate ovunque possibile. – halfer

+0

Giusto, tranne il secondo modulo non alzerà un avviso! L'assegnazione di PHP per riferimento è difficile come quella. –

+0

Nella prima parte, perché non pensi di utilizzare l'operatore '@' per sopprimere deliberatamente le notifiche di errore? – hohner

risposta

0

Se si desidera solo per verificare se una variabile è impostata e non nullo, allora è meglio di prova:

if (! empty($this->blah['something']['else'])) {...} 

In questo modo si evita la creazione di due riferimenti ad un valore che non poteva anche non esistere.

A mio parere, ogni volta che si crea un nuovo riferimento allo stesso valore, il codice diventa più difficile da comprendere a colpo d'occhio.

Se avete bisogno di zero non vuota, quindi si crea meglio una funzione globale come questo:

function eempty(& $var) { 
    return empty($var) && $var !== 0; 
} 
+0

Hai fatto dei buoni punti ma il tuo primo esempio è errato ... chiamare empty() su una variabile non dichiarata farà apparire un avvertimento, credo. –

+0

Come indicato nella documentazione di PHP: "empty() è l'opposto di (booleano) var, tranne che non viene generato alcun avviso quando la variabile non è impostata". Vedere http://www.php.net/manual/en/function.empty.php –

+1

I in piedi corretto! Buono a sapersi. –

0

Personalmente penso che potrebbe essere essere più convenzionale, ma assegnare un valore di riferimento come quello mi sembra un po 'ridondante. Mi limiterei a usare l'operatore ternario più comunemente usato nella tua situazione. Spesso è molto più chiaro da capire. Certo, dovresti seguire la tua semantica personale il più vicino possibile.