Hat PHP eine Kurzschlussauswertung?
Folgenden code:
if (is_valid($string) && up_to_length($string) && file_exists($file))
{
......
}
Wenn is_valid($string)
false zurückgibt, wird der php-interpreter noch überprüft, später Bedingungen wie der up_to_length($string)
? Wenn dem so ist, warum wird dann zusätzliche Arbeit leisten, wenn Sie nicht haben, um?
Kommentar zu dem Problem
Einige Lesung zu gehen zusammen mit all diesen Antworten: en.wikipedia.org/wiki/Short-circuit_evaluation
Dies bezieht sich auf das Thema der short-circuit-evaluation und die verschiedenen Sprachen verarbeiten es anders.
@AJ: ganz Ehrlich, ich bin noch um zu sehen, eine (ernst/weit verbreitet) Programmiersprache, die nicht über Kurzschluss-Bewertung für das logische und und das logische oder. Haben Sie ein Beispiel?
@delnan - ich denke was Sie meinte war "die Meisten verbreiteten Programmiersprachen nicht umsetzen begierig Betreiber."
@delnan - VB und Fortran in den Sinn kommen...
InformationsquelleAutor der Frage Muntasir | 2011-04-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, der PHP-interpreter ist "faul", was bedeutet, es wird die minimale Anzahl von vergleichen, die Auswertung der Bedingungen.
Wenn Sie überprüfen möchten, versuchen Sie dies:
InformationsquelleAutor der Antwort Zach Rattner
Ja, tut es. Hier ein kleiner trick, setzt auf short-circuit-evaluation. Manchmal hat man vielleicht eine kleine if-Anweisung, die Sie lieber schreiben als ternäre, z.B.:
Neu geschrieben werden kann als:
Aber was dann, wenn der block ja auch erforderlich, eine Funktion, die ausgeführt werden?
Gut umschreiben als ternäre noch möglich ist, weil der Kurzschluss-Auswertung:
In diesem Fall ist der Ausdruck (do_something() || true), so ändert dies nichts an dem Gesamtergebnis der ternären, sorgt aber dafür do_something() wird nur ausgeführt, wenn $bestätigt ist wahr.
InformationsquelleAutor der Antwort Robert
Zusammenfassend daher:
Bitweisen Operatoren & und |
Sie immer bewerten die beiden Operanden.
Logische Operatoren sind AND, or, && und ||
UND und ODER immer auswerten beiden Operanden.
&& und || nur auswerten der rechten Seite, wenn Sie brauchen.
InformationsquelleAutor der Antwort Steve Douglas
Nein, tut es nicht mehr überprüfen Sie die anderen Bedingungen, wenn die erste Bedingung nicht erfüllt ist.
InformationsquelleAutor der Antwort Obay
Habe ich meine eigene short-circuit-evaluation logic, leider es ist nichts, wie javascript quick syntax, aber vielleicht ist dies eine Lösung, die Sie nützlich finden könnten:
Ich kann mich nicht erinnern, Woher ich die folgende Logik aus, aber wenn Sie tun, die folgenden;
Können Sie überspringen, schreiben zu müssen, die wahre Bedingungs-variable wieder, nachdem die Fragezeichen, e.g:
Als sehr wichtige Beobachtung, wenn mit der Ternärer Operator diese Weise, werden Sie feststellen, dass, wenn ein Vergleich gemacht wird, es wird übergeben Sie den Wert dieses Vergleichs an, da gibt es nicht nur eine einzelne variable. E. g:
InformationsquelleAutor der Antwort Perspective
Nein ist es nicht. Dies ist immer ein guter Ort, um zu optimieren, um den Bedingungen.
InformationsquelleAutor der Antwort wlk
Seite Hinweis: Wenn Sie möchten, vermeiden Sie die faule überprüfen, und führen Sie jeden Teil der Bedingung, in diesem Fall müssen Sie die Verwendung der logischen UND so:
Dies ist nützlich, wenn Sie brauchen, zum Beispiel-Aufruf von zwei Funktionen auch wenn der erste false zurückgegeben.
InformationsquelleAutor der Antwort Patricio Rossi
Meine Wahl: nicht Vertrauen Kurzschluss-Auswertung in PHP...
Dem zweiten Teil der Bedingung 1 || saySomething() ist irrelevant, denn es wird immer true zurückgegeben. Leider saySomething() ausgewertet wird, & durchgeführt.
Vielleicht bin ich falsch verstanden, die genaue Logik der Kurzschluss Ausdrücken, aber das sieht nicht aus wie "wird es nicht die minimale Anzahl von vergleichen möglich" mir.
Darüber hinaus, es ist nicht nur eine Leistung Anliegen, wenn Sie Zuweisungen innerhalb Vergleiche oder wenn Sie etwas tun, macht einen Unterschied, als nur der Vergleich von Zeug, könnten Sie am Ende mit unterschiedlichen Ergebnissen.
Sowieso... vorsichtig sein.
InformationsquelleAutor der Antwort Beto Aveiga