2014-05-20 8 views
9

So habe ich eine PHP-Anweisung der folgenden Art:PHP scheint eine if-Anweisung zu evaluieren rückwärts

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

Was ich sehe, passiert, ist, dass, wenn $ z 50 ist, $ x nicht bekommt gesetzt, weil die Funktion nie aufgerufen wird. Ist das wirklich möglich? Ich kann das leicht beheben (und habe es getan), aber ich denke, ich bin verwirrt, dass das passiert und ich sicherstellen will, dass ich keine Fehler mache. Ich habe versucht herauszufinden, wie OR-Ausdrücke wie diese bewertet werden. Gibt es einen Ort, an dem ich nachsehen kann, wie PHP "kompiliert" wird?

+0

IMHO ist es gut, Praxis-Tests zu tauschen - Sei '$ z == 50' zuerst. Wenn es passiert, müssen wir die Funktion nicht aufrufen. – hsz

+7

Die Bedingungen werden von links nach rechts ausgewertet. Vollständiger Codebeispiel oder nicht geschehen. –

+2

Wie in den Antworten unten zu sehen ist, werden Bedingungen nicht von links nach rechts ausgewertet, sie werden in der Reihenfolge ihres Vorrangs bewertet. –

Antwort

12

|| hat higher precedence als =, was bedeutet, dass Ihr Ausdruck wird:

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

Das bedeutet, dass $x immer entweder true oder false sein. Nichts anderes.

Versuchen:

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

Oder besser lesbar:

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

Sie haben Operatorpräzedenz Problem. Prüfen Sie dies http://www.php.net/manual/en/language.operators.precedence.php

Da || höhere Priorität hat als = Ihr Ausdruck mag diese Statt

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

sieht (was ich denke, Ihre Absicht war)

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

Sorry, nur ein paar Sekunden zu langsam;) –

+2

@NiettheDarkAbsol Gute Antwort ist nie zu langsam – mleko

+0

Ja, tatsächlich, das ist es genau! Ugh, ich dachte, ich hätte sogar versucht, Paranthesis hinzuzufügen, damit es funktioniert, aber ich muss es falsch verstanden haben. Scheint so einfach (und dumm von mir) jetzt! Vielen Dank! – user3656957