2012-04-08 16 views
6

Ich bin ein bisschen ein Optimierungs Freak (zumindest nach meiner Definition) und diese Frage nervt mich seit einer ganzen Weile.PHP || und && logische Optimierung

Ich frage mich, ob PHP einige Optimierungen macht auf & & und ||: Nehmen Sie das folgende Beispiel:

$a = "apple"; 
$b = "orange"; 
if ($a == "orange" && $b == "orange") { 
    //do stuff 
} 

Wenn dieser Code ausgeführt wird, wird es prüfen, ob ein $ gleich „orange. " In diesem Fall ist es nicht. Es gibt jedoch einen Operator & &. Da der erste Teil ($ a == "orange") bereits falsch zurückgegeben wurde, wird PHP immer noch prüfen, ob $ b gleich "orange" ist.

Ich habe die gleiche Frage für ||:

$a = "orange"; 
$b = "orange"; 
if ($a == "orange" || $b == "orange") { 
    //do stuff 
} 

Wenn es überprüft, ob $ a "orange", gleich ist es wahr zurückgibt. Da würde das || operator return true, wird PHP sogar den zweiten Teil von || prüfen (da wir schon wissen, dass es wahr sein wird)?

Hoffentlich mache ich hier Sinn, und hoffentlich hat jemand eine Antwort für mich. Vielen Dank!

+0

Das ist, was ich immer angenommen habe. Und in der Praxis funktioniert der AND-Operator auf diese Weise. Zum Beispiel könnte ich 'if (isset ($ a) && $ eine Instanz von SomeClass && $ a-> someMethod() == 'orange') tun und muss jeden Schritt der Bedingung bestehen, um die nächste zu testen. Aber ich habe nichts, um mich zu unterstützen, außer dass ich weiß, dass es funktioniert. –

+2

Warum nicht versuchen?'if (true || die()) {echo '1';}' und 'if (true && die()) {echo '1';}' –

Antwort

6

PHP verwendet short circuit evaluation mit binärem conditionals (wie &&, || oder deren konstante Äquivalente), so dass, wenn das Ergebnis der LHS Auswertemittel die RHS ist nicht notwendig, wird es nicht.

Zum Beispiel ...

method_exists($obj, 'func') AND $obj->func(); 

... ist eine Ausnutzung dieser Tatsache. Die RHS wird nur ausgewertet, wenn die LHS in diesem Beispiel einen truthy Wert zurückgibt. Die Logik macht hier Sinn, da Sie nur eine Methode aufrufen möchten, wenn sie existiert (solange Sie nicht __call() verwenden, aber das ist eine andere Geschichte).

Sie können auch OR in ähnlicher Weise verwenden.

Dieses Muster wird oft als erste Zeile in PHP-Dateien verwendet, die enthalten sein sollen und nicht direkt aufgerufen werden. Wenn die BASE_PATH Konstante nicht existiert, ist die LHS Falsy so führt es die RHS, die die() s das Skript ist.

+0

Könntest du das vielleicht aus Laiensprache umschreiben? Haha. Ich werde eine schnelle Google-Suche nach diesen Wörtern machen. – fruitcup

+0

@DrAgonmoray nach der ersten Bedingung wird PHP nur zusätzliche Bedingungen bewerten, wenn nötig :) – rawb

+0

@rawb Danke. :) – fruitcup

1

Ja, PHP schließt die Operatoren && und || kurz, dh nein, der rechte Operand wird nicht ausgewertet, wenn der Wert des linken Operanden bedeutet, dass er nicht ausgewertet werden muss. Sie müssen nicht optimiert werden. Sie können es wie folgt testen:

function one() { 
    echo "One"; 
    return false; 
} 

function two() { 
    echo "Two"; 
    return true; 
} 

one() && two(); // Outputs One 
echo "\n"; 
two() || one(); // Outputs Two 

Here's a demo. Wenn es keine Kurzschlüsse waren, würden Sie erhalten:

OneTwo 
TwoOne