Antworten
Nein, daß ist kein Zufall. Sobald eine Bedingung nicht zutrifft, wird in dem Fall sofort die Überprüfung beendet.
*** Nobody ***
2.
Das ist klar, aber kann ich mich auch darauf verlassen, daß es immer "von links nach rechts" ausgewertet wird? Habe leider nirgens in der Doku einen verlässlichen Hinweis finden können.
3.
Ja, das ist so und bleibt auch so.
*** Nobody ***
4.
Okay danke, falls meine Anwendung dann in 10 Jahren auf PHP12 nicht mehr portabel ist weiß ich ja bei wem ich mich beschweren kann ;-)
5.
ist doch in deinem fall eh egal von welcher seite es ausgewertet ist.
du sagst doch : " nur wenn $a UND $b zutreffen" also warum sollte man weiterprüfen wenn man schon eine nicht-zutreffende bedingung gefunden hat?
6.
Das war doch nur ein Beispiel zur Veranschaulichung :-)
Durch die Prüfung können Nebeneffekte geschickt genutzt werden. Als besseres Beispiel fällt mir noch folgendes ein, damit dürfte klar werden was ich meine:
Code: In Zwischenablage kopieren (nur IE)
Durch dieses Konstrukt bekommt man immer den "richtigen" Fehler angezeigt, aber falls die Reihenfolge der SQL-Queries von Bedeutung ist (was ja meistens der Fall ist) muß man eben wissen, wie PHP die Prüfung vornimmt.
7.
Dieses Verhalten hat sogar einen eigenen Namen und wird in fast allen Programmiersprachen eingesetzt. Meistens gibt es zwei Gruppen von "und" und "oder" Operatoren:
Die eine Gruppe funktioniert genau wie bei PHP nicht-strikt, d.h. bei "und" wird die Abarbeitung abgebrochen, wenn der erste Teil nicht erfüllt ist und bei "oder" wird abgebrochen, wenn bereits der erste Teil erfüllt ist.
Die zweite Gruppe arbeitet strikt, d.h. es werden immer garantiert beide Parameter ausgewertet.
Sinn macht das vor allem bei solchen Abfragen:
Code: In Zwischenablage kopieren (nur IE)
In diesem Beispiel DARF die zweite Abfrage nur dann ausgeführt werden, wenn die erste wahr ist, denn $a[0] ist nur dann auch belegt!
8.
Zitat:
oimel postete
In diesem Beispiel DARF die zweite Abfrage nur dann ausgeführt werden, wenn die erste wahr ist, denn $a[0] ist nur dann auch belegt!
Genau für so einen Zweck werde ich das auch primär einsetzen, zunächst ein isset() auf ein Array-Feld und dann ein is_object(). So spare ich mir die Warnings, falls der Array-Eintrag noch gar nicht existiert...
9.
Operator-Rangfolge
http://www.php.net/manual/de/language.operators.php#language.operators.precedence
10.
Nur, damit keine Verwechslungen entstehen: Die Operator-Rangfolge (man sagt auch "Bindungsstärke"), die Reihenfolge der Auswertung ("Assoziativität") sowie die Striktheit sind drei unterschiedliche Kriterien. Anscheinend hat man sich Erklärungen zur Striktheit in der PHP-Doku aber gespart.
11.
Richtig, die Operator-Rangfolge hat mit der Assoziativität zunächst mal nichts zutun. Aber mir ist gerade eben zum ersten Mal die Spalte "Associativity" auf der Seite mit der Operator-Rangfolge näher aufgefallen. Wenn man annimmt, daß dies bedeutet, welcher Operant zuerst ausgewertet wird, kommt man beim Auseinanderbröseln komplexer Verschachtelungen auch insgesamt auf "von links nach rechts" (wenn in der Spalte left steht). Das würde bedeuten, daß meine Grund-Annahme (Auswertung von links nach rechts) nun doch offiziell durch das Manual bestätigt wird, wenn auch nur indirekt ;-)
12.
Die REIHENFOLGE der Auswertung heißt nicht, OB beide Parameter ausgewertet werden. Folgendes Beispiel:
Code: In Zwischenablage kopieren (nur IE)
Je nachdem, in welcher Reihenfolge "+" ausgeführt wird ob überhaupt beide Parameter ausgewertet werden, bringt dieses (zugegebenermaßen recht konstruierte) Beispiel unterschiedliche Ergebnisse.
13.
stimmt, aber ich darf doch hoffentlich im "glauben" bleiben, dass die anweisung $b=mal()+plus(); von rechts nach links ausgeführt wird, oder?
14.
@esel: Ist das ne Fangfrage? :) ... Mal ernsthaft: Das kommt immer auf die Programmiersprache an, normalerweise werden Ausdrücke eher von links nach rechts als umgekehrt ausgewertet. Deswegen gibt es ja auch in der Doku diese Tabelle mit der Bindungsstärke und der Assoziativität. Ich kenne aber auch Programmiersprachen, die völlig anders funktionieren und Auswertungen durch Termersetzungen durchführen -> da gibt es gar keine definierte Auswertungsreihenfolge.
Aber deswegen hab ich ja schon ein paar Mal drauf hingewiesen, dass man in Funktionen möglichst keine globalen Variablen benutzen soll, denn das Problem aus meinem Beispiel ergibt sich wirklich uasschließlich, wenn man globale Variablen benutzt.
15.
Außerdem dürfte lt. Tabelle auch klar sein, daß zuerst das mal(), dann das plus() aufgerufen wird. (+-Operator hat links-Assoziativität). Daß der Ausdruck vor der Zuweisung ausgewertet wird ist ja eigentlich trivial, oder? Steht aber sogar ganz ausdrücklich in der Doku: "Since assignments are parsed in a right to left order, [...]"