2014-05-20 14 views
9

Così ho avere una dichiarazione PHP del seguente tipo:PHP sembra essere valutando un'istruzione if indietro

if ($x=function($y) || $z == 50) {

Quello che vedo accadendo è che se $ z è 50, $ x non ottiene impostato perché la funzione non viene mai chiamata. È davvero possibile? Posso (e ho fatto) sistemarlo facilmente, ma credo di essere confuso dal fatto che sia quello che sta succedendo e voglio essere sicuro di non commettere errori come questo andando avanti Ho cercato di scoprire come vengono valutate le espressioni OR come questa. C'è un posto dove posso guardare per vedere come viene compilato php?

+0

IMHO è buona pratica per scambiare i test - Sia '$ z == 50' come prima cosa. Passa, non abbiamo bisogno di chiamare la funzione. – hsz

+7

Le condizioni vengono valutate da sinistra a destra. Esempio di codice completo o non è successo. –

+2

Come si vede nelle risposte seguenti, le condizioni non vengono valutate da sinistra a destra, vengono valutate in ordine di precedenza. –

risposta

12

|| ha higher precedence di =, il che significa che la tua espressione diventa:

$x = (foo($y) || ($z == 50)); 

Ciò significa che $x saranno sempre sia true o false. Nient'altro.

Prova:

if(($x = foo($y)) || ($z == 50)) 

Oppure, più leggibile:

$x = foo($y); 
if($x || $z == 50) 
16

Hai problema precedenza degli operatori. Controllare questo http://www.php.net/manual/en/language.operators.precedence.php

Perché || ha precedenza maggiore rispetto = tua espressione Sembra veramente questo

if ( 
    $x = ( 
     function($y) || ($z == 50) 
    ) 
) 

Invece di (quello che penso fosse vostra intenzione)

if ( 
    ($x = function($y)) || ($z == 50) 
) 
+0

Siamo spiacenti, solo pochi secondi troppo lenti;) –

+2

@NiettheDarkAbsol La buona risposta non è mai troppo lenta – mleko

+0

Sì, davvero, questo è esattamente! Uh, pensavo di aver provato ad aggiungere parasteiche per farlo funzionare, ma devo averlo sbagliato. Sembra così semplice (e stupido da parte mia) ora! Grazie! – user3656957