2009-08-03 9 views
0

Verzeihen Sie, wenn der Titel nicht genau das entspricht, was ich frage, habe ich eine harte Zeit, die Frage genau zu beschreiben.Zusammengesetzte boolesche Ausdrücke in C/PHP und Variablenzuweisung

Betrachten Sie die folgende PHP-Code:

#!/usr/bin/php 
<?php 
class foo{ 
    function bar() 
    { 
     return true; 
    } 
} 
if (true && $a = new foo() && $a->bar()) { 
    echo "true"; 
} else { 
    echo "false"; 
} 

Es gibt

Fatal error: Call to a member function bar() on a non-object 

für die a- $> bar(); Ausdruck.

Betrachten Sie die folgende C-Code:

int main(void) 
{ 
    int i = 0; 

    if (i += 1 && printf("%d\n", i)) 
    { 
     printf("Done: %d.\n", i); 
    } 
} 

Es gibt:

0 
Done: 1. 

Warum ist das? Da C und PHP behaupten, diese Ausdrücke kurzzuschließen und von links nach rechts zu bewerten, erwarte ich, dass ein Wert, der in Ausdrücken nach links gesetzt ist, in Ausdrücken auf der rechten Seite verwendet wird. Gibt es etwas, das mir fehlt?

Antwort

7

Ihr Problem ist jetzt mit Vorrang für den Bediener. PHP wertet zur Zeit die PHP-Anweisung als solche:

if (true && $a = (new foo() && $a->bar())) 

In diesem Fall $a nicht durch die Zeit definiert Sie $a->bar() versuchen aufrufen.

Was Sie wirklich wollen, ist dies:

if (true && ($a = new foo()) && $a->bar()) 

Mit Klammern in komplexen Bedingungen wird diese Art von Fehler nicht passiert zu verhindern.

EDIT: Proof

if(true && $a = true && false) { } 
var_dump($a); // bool(false) 

if(true && ($b = true) && false) { } 
var_dump($b); // bool(true) 
+0

gleiche Quelle Problem für C. – AProgrammer

+0

+1. Dasselbe passierte mit dem C-Codebeispiel. Wenn Sie i + = 1 in Klammern setzen, tut es was OP erwartet. – tsg

+0

Son of a gun, Betreiber Vorrang nie kam mir in den Sinn. Ich habe immer gedacht, dass Zuweisungsoperationen eine ähnliche Priorität wie Vergleichsoperatoren haben. Ein kurzer Blick auf http://us3.php.net/manual/en/language.operators.precedence.php erinnerte mich daran, dass ich mich oft über große ... viele ... Dinge täusche. –