Für mehr Gleichheit in PHP (Äquivalzenzrelationen)
Nein, dass wird kein Frauen und Softwareentwicklung Artikel. Es geht um eine ganz andere, technische Gleichheit. Und zwar geht es um „==“. Ich gehe jetzt mal davon aus, dass die meisten von euch diesen Vergleichsoperator einsetzt, wenn er PHP programmiert. Es ist der Standard und ich tippe mal drauf, dass ein paar PHP Entwickler „===“ noch nie eingesetzt haben.
Für Äquivalzenzrelationen in der Mathematik, wie zum Beispiel die Gleicheitsrelation, gelten drei Regeln:
- Reflexivität: a = a
- Symmetrie: a = b daraus folgt b = a
- Transitivität: a = b und b = c daraus folgt a = c
Die Regeln klingen sehr mathematisch, aber eigentlich ganz intuitiv. Einfach mal mit ein paar Zahlen durchprobieren. Aber diese Regeln gelten nicht für PHP und „==“, auch wenn man das eigentlich denken würde. Nehmen wir einfach mal ein Beispiel.
$a = 'hallo'; $b = 'hallo'; $c = 'hallo';
- $a == $a
- $a == $b und $b == $a
- $a == $b und $b == $c daraus folgt $a == $c
Stimmt also alles. Das gilt aber nur, solange die Variablen vom gleichen Typ sind. Schauen wir uns das Ganze mal für gemischte Typen an.
$a = 0; $b = "hallo"; $c = "tschüss";
- $a == $a, stimmt
- $a == $b, stimmt auch in PHP
- $b == $a und $a == $c stimmt beides, nur leider stimmt $b == $c nicht
Jemand, der ein gewisses mathematisches Grundwissen besitzt, wird dies vielleicht ein wenig verwundern, da es nicht ganz intuitiv ist.
Falls man also sicherstellen will, dass man mit einer Äquivalenzrelation hantiert, sollte man den „===“ Operator verwenden, denn für diesen gelten alle drei Regeln, da er auch den Typen der Variablen mit einbezieht. Ich habe diesen Artikel zwar unter „wtf“ einsortiert, aber wenn man es weiß, dann ist dieses Verhalten nicht ganz so verwirrend. Es vereinfacht das Vergleichen in vielen Fällen ungemein, da man nicht erst auf den richtigen Typen casten muss. Zum „wtf“ wird es dann erst, wenn man zwei Dinge vergleicht, die intuitiv unterschiedlich, aber laut PHP doch gleich sind. Ich denke jeder von euch stand schon einmal vor so einem Problem.
Dahingehend ganz wichtig: http://de3.php.net/types.comparisons
Warum ein Vergleich auf 0 immer true ist, erschließt sich mir nicht..
Naja, beim casten eines String aus einen Integer, werden Zeichen bis zum ersten Auftauchen eines nicht numerischen Zeichens genommen. Ist das erste Zeichen nicht numerisch, so ist der Integer-Wert 0.
Abgesehen davon ist ein vergleich auf 0 alles andere als immer true 😉 Siehe meinen Link …
So ein schmarn. Aber danke 🙂
„===“ ist auch schneller als „==“.
Also kann ich jedem nur empfehlen „===“ zu benutzen wo es nur geht 🙂
Gruß Sven
Hi Sven,
gibt es dazu auch einen Link / Beleg, denn dass würde mich nämlich sehr interessieren! 🙂
Viele Grüße
Ulf
Aber wer kommt denn auf die Idee, zu testen ob ein String äquivalent zu 0 ist?
z.B. http://www.phpbench.com/ unter „Control Structures“.
Kannst dir natürlich auch eigene Tests schreiben.
Gruß Sven
@Lukas, das passier wohl eher aus Versehen, wenn man was mit den Usereingaben vergessen hat. Casten z.B.
Ich glaube nicht, dass der Gebrauch von === nötig ist. Es kann wie gesagt nicht sein, dass ein String mit einer Zahl verglichen wird. Das darf einfach nicht passieren.
User-Eingaben liegen in der Regel als String vor.
Danke Sven für den Link, kannte ich noch nicht und ist teilweise sehr aufschlussreich (nicht nur der == und === Vergleich)!
Viele Grü0e
Ulf
Sven, da auf performance zu achten is ähm, naja, premature optimiationund selbige führt zuehr Problemen als sie löst.
Zu diesem Fall: Das spart nur, wenn die typen unterschiedlich sind – dan spart man sich das casten … alles andere is statistisches Rauschen.