2010-03-29 8 views
28

Ich habe diese if Anweisung, die für die folgenden 2 Bedingungen testet. Das zweite ist eine Funktion goodToGo() so möchte ich es nennen, wenn die erste Bedingung bereits wahr istwird die Bedingung nach && immer ausgewertet

$value = 2239; 

if ($value < 2000 && goodToGo($value)){ 
    //do stuff 
} 

function goodToGo($value){ 
    $ret = //some processing of the value 
    return $ret; 
} 

Meine Frage über die 2, wenn Bedingungen $value < 2000&&goodToGo($value). Werden beide bewertet oder wird der zweite nur dann ausgewertet, wenn der erste wahr ist?

Mit anderen Worten, sind die folgenden 2 Blöcke gleich?

if($value < 2000 && goodToGo($value)) { 
    //stuff to do 
} 

if($value < 2000) { 
    if (goodToGo($value)){ 
     //stuff to do 
    } 
} 
+3

Ist es zu schwer zu überprüfen? –

+0

@Col, Danke für die Hilfe. Wie? – brett

+0

Haben die Funktionen drucken? if (test1() && test2()) ... –

Antwort

60

Nein - die zweite Bedingung wird nicht immer ausgeführt (was Ihre Beispiele äquivalent macht).

PHP &&, ||, and und or Operatoren sind als "Kurzschluss" Betreiber implementiert. Sobald eine Bedingung gefunden wird, die das Ergebnis für die Gesamtbedingung erzwingt, wird die Auswertung der nachfolgenden Bedingungen gestoppt.

Von http://www.php.net/manual/en/language.operators.logical.php

// -------------------- 
// foo() will never get called as those operators are short-circuit 

$a = (false && foo()); 
$b = (true || foo()); 
$c = (false and foo()); 
$d = (true or foo()); 
+0

Ich wählte diese spätere Antwort, weil es einen wirklich guten Punkt über 'bringt (wahr || foo()) '. Hätte gedacht, dass der zweite bewertet würde, da der erste "wahr" ist, aber es sieht so aus, als wäre es nicht der Fall. Gut zu wissen. – brett

+1

@ Brett, Yeah - der Schlüssel ist, dass für OR, Sie wissen, dass es wahr sein wird, wenn Sie zum ersten Mal einen TRUE finden - keine Anzahl von FALSE wird das ändern. Für AND wissen Sie, dass es FALSE sein wird, wenn Sie zum ersten Mal einen FALSE finden - keine Anzahl von TRUEs wird das ändern. – sblom

+0

Erklärung macht Sinn. – JayKandari

5

Ja. Die zwei Blöcke sind gleich. PHP verwendet wie die meisten (aber nicht alle) Sprachen Kurzschlussauswertung für && und ||.

1

Ja, die 2 Codebausteine, die Sie angegeben haben, sind gleichwertig. PHP hat einen Kurzschluss, wenn Sie also || verwenden und & &, jede Aussage nach der ersten wird nur ausgewertet, wenn nötig.

2

wird die zweite Bedingung nur überprüft werden, wenn und nur wenn erste wahr ist, damit beide Aussagen äquivalent sind.

3

Die beiden Blöcke sind identisch.

PHP logische Operatoren sind "faul", sie werden nur ausgewertet, wenn sie benötigt werden. Der folgende Code druckt "Hallo, Welt!":

<?php 
$a = 10; 
isset($a) || die ("variable \$a does not exist."); 
print "Hello, world!" 
?> 

Andere logische Operatoren umfasst & &, und, oder.

<?php 
perform_action() or die ('failed to perform the action'); 
?> 

ist ein beliebtes Idiom.

0

Immer corlate Ihre technische Sprache mit Ihrer eigenen Sprache, Ebenso hier, Wenn ich Sie in verbaler Konversation sage, ist es genau wie: Sie fragen = "wenn ich Hunger habe" & & 'Ich esse Pizza "ist ähnlich "Wenn ich Hunger habe, esse ich nur Pizza"? Also hier können Sie sehen, dass späterer Satz sagt, dass, bis ich nicht hungrig bin ich nicht Pizza essen, und der ehemalige sagt, ich bin humgry und ich esse Pizza. :-)

+1

Jetzt fühle ich mich hungrig :) Aber ich esse nicht Pizza –

Verwandte Themen