Was ist der Unterschied (falls vorhanden) zwischen (null! = $ Object) und ($ object! = Null) bei Verwendung von PHP?

8

Ich bin an Java gewöhnt und denke daher immer, dass Bedingungen von links nach rechts interpretiert werden, dh es gibt einen entscheidenden Unterschied in null != $objund$obj != null

Dies scheint bei PHP nicht der Fall zu sein.

Kann ich in PHP etwas falsch machen, wenn ich immer nullauf der linken Seite beginne ? Kann ich mein Verhalten von Java fernhalten oder muss ich mich darin üben, etwas anderes zu tun, wenn ich mit PHP-Bedingungen umgehe?

Wizard Of Tech
quelle
5
Es gibt keinen Unterschied, aber Sie sollten Yoda-Bedingungen vermeiden . Es ist seltsam, dass Sie denken, dass sie in Java Standard sind oder dass sie in Bezug auf die Interpretation irgendeinen Sinn haben.
Yannis
Aber wäre das nicht ein Argument dafür, immer mit Null zu beginnen? Ursache null = $ a lässt PHP ersticken, wobei $ a = null unentdeckt bleiben würde.
Wizard Of Tech
null = $aist Aufgabe und null != $aist Vergleich, meintest du null == $a? null = $afunktioniert nicht, und ja, bei Zuweisungen ist die Reihenfolge der Interpretation von Bedeutung - und es würde auch in Java nicht funktionieren. Sprechen wir über Bedingungen oder Aufgaben?
Yannis
lol ... aehm ... ok. Tut mir leid, dass ich mich nicht klar genug ausgedrückt habe ..... Nehmen wir an, Sie machen einen Fehler beim Schreiben einer Bedingung und erstellen einen Yoda-Ausdruck. (wie Sie sagten) Und Sie erzeugen eine Codezeile wie: ($ a = null). Es wird unbemerkt bleiben, weil Sie eine rechtliche Bedingung erstellt haben. Wenn ich meinem Team jetzt sage, dass es IMMER eine Bedingung mit null (wenn eine Nullprüfung verwendet wird) auf der linken Seite beginnen soll, kann dies helfen, diese Art von Fehler zu vermeiden. Eigentlich ... Ich habe gerade meine eigene Frage dank Ihres Feedbacks beantwortet. :-)
Wizard Of Tech
1
Inwiefern unterscheidet es sich von Java?
Phant0m

Antworten:

4
  • Meines Wissens nach gibt es keinen (technischen) Unterschied - und auch keinen in Java.
  • Verwenden Sie in PHP keine dieser Optionen.

Ich empfehle Ihnen, immer die strengen Vergleichsoperatoren zu verwenden ===und !==wenn möglich. Sie werden wissen, wann Sie tatsächlich lose Vergleichsoperatoren benötigen .

Missverständnisse

Ich glaube, Sie können über ein paar Dinge verwirrt sein:

  • Kurzschlussbetreiber
  • Reihenfolge der Bewertung
  • Vorrang des Operators

Ich habe gerade festgestellt, dass im PHP-Handbuch steht: "PHP überprüft jede Bedingung in der Reihenfolge von links nach rechts."

Nein,

  • Das PHP- Handbuch sagt das nicht , es ist ein Kommentar.
  • PHP macht das nicht .

PHP wertet die Bedingungen von links nach rechts aus, stoppt jedoch, sobald das Ergebnis bekannt ist:

expr1 && expr2

Wenn expr1ausgewertet wird false, expr2wird nicht ausgewertet. Dies wird als Kurzschluss bezeichnet und scheint nicht sehr gut dokumentiert zu sein. Ich konnte außer dem Kommentar in Beispiel 1 keine andere offizielle Anmerkung zu diesem Thema finden. Es ist jedoch ein bekanntes Merkmal.

Irrtümer

Ich bin an Java gewöhnt und denke daher immer, dass Bedingungen von links nach rechts interpretiert werden, dh es gibt einen entscheidenden Unterschied zwischen null! = $ Obj und $ obj! = Null


PHP überprüft jede Bedingung in der Reihenfolge von links nach rechts.
Ergo: Die gleiche "Best Practice" kann angewendet werden

Ergo: nichts - keine Folge. Die Schlussfolgerung folgt nicht aus der Prämisse. Verwendung constant == $variableoder $variable == constantnicht verbunden mit Kurzschluss , Reihenfolge der Auswertung oder Vorrang des Bedieners .

Undefiniertes Verhalten

Beide Operanden von !=werden immer ausgewertet. Im Fall von PHP ist die Evaluierungsreihenfolge (die hier irrelevant ist) tatsächlich nicht spezifiziert (wie in der Dokumentation nicht angegeben).

phant0m
quelle
Vielen Dank für Ihre Klarstellung zum Thema. Obwohl ich Sie in Bezug auf mein Java-Wissen nicht mag. (Siehe Abschnitt 15.7 der Java-Sprachspezifikation.) Fassen wir es zusammen. Die Reihenfolge der Auswertung ist in PHP nicht festgelegt und daher können Sie sich nicht darauf verlassen! 2. Verwenden Sie niemals! = Oder == user === oder! ==.
Wizard Of Tech
@anann Ich bin mir nicht sicher, wo du denkst, dass ich dein Java-Wissen "bewerte". Das einzige , was ich gesagt habe ist: "nor is there in Java to my knowledge."I 15,7 Abschnitt gelesen haben, aber es ist nicht wichtig hier . Solange Sie in Ihrem Vergleich keine Nebenwirkungen haben (wie in Ihrem Beispiel), spielt die Reihenfolge der Bewertung keine Rolle. Welchen Teil empfinden Sie als beleidigend?
Phant0m
0

In Bezug auf Ihren speziellen Fall wäre ein anderer Ansatz, die eingebaute PHP-Funktion is_null zu verwenden. Sie würden also mit is_null ($ MixedValue) enden, das die ganze Arbeit für Sie erledigt und den Typvergleich und alles andere richtig macht.

Vadim
quelle
-1

@ phant0m: OK Punkt genommen ... NIEMALS VERWENDEN! = oder == immer verwenden! === und === wenn Sie mit PHP codieren. Daher war diese Frage am Anfang falsch, und es gibt keine Best Practice mit NULL auf beiden Seiten der Bedingung, wenn es um PHP geht.

Wizard Of Tech
quelle
5
Es ist ein Kompromiss. Sie opfern die Lesbarkeit für die Sicherheit ( $a == NULLverschlüsselt die Absicht, NULL == $afügt einen Schutz hinzu), und diese Sicherheit ist nicht einmal so stark, weil Sie sich immer noch auf manuelle Arbeit (Gewohnheiten) anstatt auf unschlagbare automatisierte Überprüfungen verlassen. Ich denke nicht, dass sich der Kompromiss lohnt, aber das ist eine Frage der persönlichen Meinung.
tdammers
1
Oh, und ich habe immer angenommen, dass 'yoda Bedingung' sich auf das Umkehren des Subjekts und des Objekts in Ihren Bedingungen bezieht, so dass sie lauten "wenn Sie dreiundzwanzig Äpfel haben" ( 23 == num_apples) anstatt "wenn Sie dreiundzwanzig Äpfel haben" ( num_apples == 23) .
tdammers
2
Sie schienen verwirrt darüber zu sein, was eine "Yoda-Aussage" ist. Es ist "Yoda", wenn Sie den NULL (oder den konstanten Teil des Ausdrucks) links setzen: gordienoye.ca/2012/02/07/when-yoda-writes-if-statements
Martin York
2
Auch PHP warnt Sie, wenn Sie dies tun: stackoverflow.com/q/718415/14065 Sie sollten Ihre Fehlerprotokolle auf Warnungen und Fehler überprüfen und alle beheben. Der Yoda-Stil war in den 90ern der letzte Schrei. Die Behauptung war, dass es diese Gruppe von Problemen gelöst hat. In Wirklichkeit ist der Code dadurch schwerer zu lesen, und die Compiler (Interpreter) für die meisten Sprachen warnen Sie bereits vor dem Problem. Die Verwendung hat also keinen wirklichen Vorteil (vorausgesetzt, Sie stellen sicher, dass Ihr Code warnungsfrei ausgeführt wird (was Sie sowieso tun sollten)). Eine bessere Lösung besteht darin, keine Zuweisung unter bestimmten Bedingungen vorzunehmen (daher warnenfrei ausführen).
Martin York
@tdammers Lesbarkeit ist Meinung, daher sind für diejenigen von uns, die kein Problem mit ihnen haben, "Yoda-Bedingungen" das, was wir standardmäßig verwenden. Meine Augen werden zuerst von der Bedingung angezogen, damit Ordnung weder hilft noch schadet. Sogar für >und <lese ich es eher wie "Wenn das größer ist", dann lese das, das größer sein sollte, damit die Bedingung besteht, dann die andere Seite.
Izkata