Sind alle PHP-Gleichheitsvergleiche symmetrisch?

8

Ist $a == $b immer gleichbedeutend mit $b == $a ?

Ich denke, in JavaScript gibt es ein paar seltsame Fälle, in denen das wegen Castings nicht stimmt.

Ich denke ide ist korrekt. Ich werde eine weitere Frage stellen.

    
mpen 20.01.2011, 21:06
quelle

5 Antworten

3

Hängt davon ab, was zwischen diesen beiden Aufrufen passiert. Ansonsten ja, das sind die gleichen. Die Reihenfolge macht keinen Unterschied. Wenn 2 gleichbedeutend ist == Eine Zeichenfolge von 1 und eine Ganzzahl von 1 werden im Vergleich mit true zurückgegeben. Type wird ignoriert, nur der Wert wird verglichen. Also keine Miefigkeit.

Ссылка

%Vor%

Ausgaben: 1

Ссылка

BEARBEITEN

Um klarzustellen, es gibt absolut nichts, was Sie jemals in $ a oder $ b eingeben können, um eine andere Ausgabe für den Vergleich zu erhalten, indem Sie es einfach auf die andere Seite des Bedieners legen.

%Vor%

Die Ausgabe von diesem, für irgendwelche $ a oder $ b Werte, wird immer ohne Zweifel wahr wahr oder falsch falsch sein.

    
profitphp 20.01.2011, 21:10
quelle
3

Kurz gesagt, ja. $a == $b entspricht immer $b == $a . Es gibt einige kurze Kommen, wie zum Beispiel Schwimmer. Natürlich sollten Sie nicht zwei float für Gleichheit verschachteln.

BEARBEITEN
In Bezug auf Schwimmer: Wenn Sie zwei Schwimmer haben und diese vergleichen, sollten sie technisch identisch sein. Gleitkommawerte, die den gleichen Wert zu haben scheinen, müssen jedoch nicht identisch sein. Wenn $a also ein Literal .69 ist und $b das Ergebnis einer Berechnung ist, können sie sehr unterschiedlich sein, aber beide zeigen denselben Wert an. Deshalb sollten Sie Gleitkommawerte niemals mit dem == vergleichen.

Wenn Sie Floating-Point-Werte vergleichen müssen, müssen Sie in Ihrem speziellen Fall wirklich den kleinsten akzeptablen Unterschied verwenden. So etwas würde funktionieren, um Floats zu vergleichen (indem wir unsere kleinste akzeptable Differenz bei 0.000001 setzen):

%Vor%

PHP: abs - Absoluter Wert

    
Michael Irigoyen 20.01.2011 21:13
quelle
3

Der einzige Typ, den ich anders sehen könnte, ist etwa:

%Vor%

Um zu sehen warum, schau es dir an

%Vor%

Wenn A zuerst ausgeführt wird, ist das Ergebnis 2 und das Ergebnis von B ist 2, also sind sie gleich und der Test wird true sein.

Wenn B zuerst ausgeführt wird, ist das Ergebnis 1 und das Ergebnis von B ist 2, also sind sie nicht gleich und der Test wird false sein.

Aber für jeden einzelnen Typvergleich (wobei A eine Variable und kein Ausdruck ist) wird es immer reflexiv sein.

Also ist A == B im allgemeinen Sinne nicht immer 100% äquivalent zu B == A . Für Variablen ist es immer gleichwertig. Aber für komplexe Ausdrücke, die die Zuweisung oder Änderung von Variablen beinhalten, ist dies möglicherweise nicht der Fall.

    
ircmaxell 21.01.2011 15:44
quelle
2

Ссылка

Es gibt verschiedene Operatoren, die Sie verwenden können, wenn Sie im Vergleich den Typ Casting berücksichtigen möchten. == wird bei gleichem Wert als wahr ausgewertet, vergleicht jedoch nicht den Datentyp. === wird als wahr ausgewertet, wenn die Werte gleich sind wie auch die Datentypen. Die Verwendung von Letzterem berücksichtigt Typ-Casting, wo es normalerweise ignoriert würde (zB: String, der eine Ganzzahl und eine ganze Zahl darstellt, die verglichen werden.)

Die Reihenfolge der Logik in der Bedingung sollte keinen Unterschied machen.

    
DeaconDesperado 20.01.2011 21:13
quelle
1

Ich habe eine Reihe von Variationen ausprobiert und kann keinen Fall finden, in dem ($a == $b) !== ($b == $a) , aber bisher noch keiner funktioniert:

%Vor%

Also gebe ich an dieser Stelle auf. Ideen willkommen!

    
Josh 20.01.2011 22:14
quelle

Tags und Links