Facebook
Twitter
Google+
Kommentare
12

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:

  1. Reflexivität: a = a
  2. Symmetrie: a = b daraus folgt b = a
  3. 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';
  1. $a == $a
  2. $a == $b und $b == $a
  3. $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";
  1. $a == $a, stimmt
  2. $a == $b, stimmt auch in PHP
  3. $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.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

12 Comments

  1. 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 …

    Reply
  2. „===“ ist auch schneller als „==“.
    Also kann ich jedem nur empfehlen „===“ zu benutzen wo es nur geht 🙂

    Gruß Sven

    Reply
  3. 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.

    Reply
  4. Danke Sven für den Link, kannte ich noch nicht und ist teilweise sehr aufschlussreich (nicht nur der == und === Vergleich)!

    Viele Grü0e
    Ulf

    Reply
  5. 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.

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen