Es gibt einige Scherze und irreführende Kommentare, sogar teilweise falsche Informationen in den Antworten hier. Ich möchte versuchen, sie zu verbessern:
Erstens , wie einige betont haben, haben Sie einen Fehler in Ihrem Code, der sich auf die Frage bezieht:
if ($status = 'clear' AND $pRent == 0)
sollte sein (beachten Sie die ==
statt =
im ersten Teil):
if ($status == 'clear' AND $pRent == 0)
was in diesem Fall funktional äquivalent zu ist
if ($status == 'clear' && $pRent == 0)
Zweitens ist zu beachten, dass diese Operatoren ( and or && ||
) Kurzschlussoperatoren sind. Das heißt, wenn die Antwort mit Sicherheit aus dem ersten Ausdruck bestimmt werden kann, wird der zweite niemals ausgewertet. Auch dies spielt für Ihre obige debuggte Zeile keine Rolle, aber es ist äußerst wichtig, wenn Sie diese Operatoren mit Zuweisungen kombinieren, weil
Drittens ist der wahre Unterschied zwischen and or
und && ||
die Priorität des Operators . Insbesondere ist es wichtig, dass sie && ||
eine höhere Priorität als die Zuweisungsoperatoren ( = += -= *= **= /= .= %= &= |= ^= <<= >>=
) haben, während sie and or
eine niedrigere Priorität als die Zuweisungsoperatoren haben. In einer Aussage, die die Verwendung von Zuweisung und logischer Bewertung kombiniert, ist es daher wichtig, welche Sie wählen.
Geänderte Beispiele von der PHP-Seite zu logischen Operatoren :
$e = false || true;
wird true
diesen Wert auswerten und ihm zuweisen $e
, da er ||
eine höhere Operatorpriorität als =
hat und daher im Wesentlichen wie folgt ausgewertet wird :
$e = (false || true);
jedoch
$e = false or true;
wird zuweisen false
zu $e
(und dann die Durchführung or
Betrieb und zu bewerten , true
da) =
als höheren Operator Vorrang hat or
, im wesentlichen wie diese Auswertung:
($e = false) or true;
Die Tatsache, dass diese Mehrdeutigkeit sogar besteht, lässt viele Programmierer einfach immer verwenden && ||
und dann funktioniert alles klar, wie man es in einer Sprache wie C erwarten würde, dh. zuerst logische Operationen, dann Zuordnung.
Einige Sprachen wie Perl verwenden diese Art von Konstrukt häufig in einem ähnlichen Format:
$connection = database_connect($parameters) or die("Unable to connect to DB.");
Dies würde theoretisch die Datenbankverbindung zuweisen $connection
, oder wenn dies fehlschlägt (und wir gehen hier davon aus, dass die Funktion etwas zurückgibt, das false
in diesem Fall bewertet wird), wird das Skript mit einer Fehlermeldung beendet. Wenn aufgrund eines Kurzschlusses die Datenbankverbindung erfolgreich ist, die()
wird die nie ausgewertet.
Einige Sprachen, die dieses Konstrukt direkt zulassen, verbieten Zuweisungen in bedingten / logischen Anweisungen (wie Python), um die Amiguität umgekehrt zu entfernen.
PHP hat beides zugelassen, sodass Sie nur einmal etwas über Ihre beiden Optionen lernen und dann codieren müssen, wie Sie möchten, aber hoffentlich sind Sie auf die eine oder andere Weise konsistent.
Wenn Sie Zweifel haben, setzen Sie einfach einen zusätzlichen Satz Klammern ein, um alle Unklarheiten zu beseitigen. Diese werden immer gleich sein:
$e = (false || true);
$e = (false or true);
Mit all diesem Wissen bewaffnet, bevorzuge ich die Verwendung, and or
weil ich der Meinung bin, dass dadurch der Code besser lesbar wird. Ich habe nur die Regel, Zuordnungen nicht mit logischen Auswertungen zu kombinieren. Aber an diesem Punkt ist es nur eine Präferenz, und Konsistenz ist hier viel wichtiger als die Seite, für die Sie sich entscheiden.
$items_list = array(2,177);
$rules_list = array( '[(13 OR 3 OR 2 )]', '[(54 OR 77 ) AND 17 AND 59 AND 36 ] OR [(2 AND 36 )]', '[(2 OR 3 OR 13 ) AND 30 ]', '[(2 )] OR [(13 OR 4 ) AND (17 )]', '[(2 )] OR [(13 OR 3 ) AND 17 ]', '[(2 AND 30 ) OR (3 AND 30 )]', );
// Berechne das Bool-Ergebnis jeder Regel mit dem bereitgestellten Item-Array`