if ('costante' == $ variabile) vs. if ($ variabile == 'costante')

46

Ultimamente, ho lavorato molto in PHP e specificamente nel framework di WordPress. Sto notando un sacco di codice sotto forma di:

if ( 1 == $options['postlink'] )

Dove mi sarei aspettato di vedere:

if ( $options['postlink'] == 1 )

Questa è una convenzione trovata in alcune lingue / framework? C'è qualche ragione per cui l'approccio precedente è preferibile a quest'ultimo (da una prospettiva di elaborazione, o da una prospettiva di analisi o anche da una prospettiva umana?)

O è solo una questione di gusti? Ho sempre pensato che fosse meglio quando si eseguiva un test, che l'elemento variabile sottoposto a test rispetto ad alcune costanti si trovasse a sinistra. Sembra mappare meglio al modo in cui faremmo la domanda in linguaggio naturale: "se la torta è il cioccolato" piuttosto che "se il cioccolato è la torta".

    
posta Tom Auger 06.05.2011 - 00:43
fonte

3 risposte

79

La ragione principale per fare questo (il cosiddetto "condizionale Yoda") è prevenire incidenti in cui utilizzi accidentalmente un operatore di assegnazione ( = ) anziché l'operatore di confronto uguale ( == ).

Cioè, se hai fatto l'errore di fare:

$foo = 5;
if ($foo = 1) {
  // Stuff
}

L'istruzione valuterà in true (o, nel caso di alcuni linguaggi come PHP - un valore di verità) e avrai un bug difficile da trovare.

Ma se l'hai fatto:

$foo = 5;
if (1 = $foo) {
  // Stuff
}

Riceverai un errore irreversibile perché non puoi assegnare $foo a un intero.

Ma come hai sottolineato, invertire l'ordine generalmente rende le cose meno leggibili. Quindi, molti standard di codifica (ma non tutti, incluso WordPress ) suggeriscono o richiedono $foo == 1 nonostante i benefici della ricerca bug di% % co_de.

In generale, il mio consiglio è di seguire qualsiasi standard di codifica stabilito, se ce n'è uno: per WordPress, significa usare i condizionali Yoda.

Quando non c'è, ed è impossibile stabilirne uno attraverso il consenso con i tuoi colleghi, è la scelta del rivenditore.

    
risposta data 06.05.2011 - 00:48
fonte
13

È un meccanismo di codifica difensivo pensato per impedire un uso accidentale dell'operatore di assegnazione.

Considera un abuso / errore dell'operatore di assegnazione al posto dell'operatore di uguaglianza

if ( $options['postlink'] = 1  )

Il condizionale sopra riportato restituirebbe sempre true, ma probabilmente non è ciò che il programmatore originale aveva in mente. Considera, al suo posto, questo

if( 1 = $options['postlink'])

Qui, PHP (e la maggior parte delle altre lingue) rifiuterebbero di essere eseguito, poiché è impossibile assegnare qualsiasi cosa al valore fisso di 1 . Mediante la codifica di tutte le istruzioni condizionali in questo modo, si garantisce automaticamente l'utilizzo accidentale di un operatore di assegnazione in modo condizionale.

    
risposta data 06.05.2011 - 00:50
fonte
8

Mi piace usare quella convenzione in java per rimuovere la possibilità di un'eccezione di puntatore nullo. Quindi qualcosa del genere non ti causerà alcun problema o bisogno di codice aggiuntivo:

String foo = null;

if ("bar".equals(foo))
{
    //Do something
}
    
risposta data 06.05.2011 - 01:12
fonte