• Für mehr Gleichheit in PHP (Äquivalzenzrelationen)

    von Nils Langner am 26. Januar 2009

    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.

    Nils Langner Nils Langner

    Auch wenn Ihr es mir nicht glauben werdet, aber ich habe nichts gegen PHP. Ich rege mich einfach nur gerne auf. Ok so schlimm ist es auch nicht. Eigentlich wollte ich schon immer einen Blog haben und da ...

    Zum Profil von Nils Langner

    12 Kommentare »


    • unset
      am 26. Januar 2009 um 09:07 Uhr

      Dahingehend ganz wichtig: http://de3.php.net/types.comparisons


    • kb
      am 26. Januar 2009 um 10:05 Uhr

      Warum ein Vergleich auf 0 immer true ist, erschließt sich mir nicht..


    • unset
      am 26. Januar 2009 um 10:12 Uhr

      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 …


    • kb
      am 26. Januar 2009 um 10:21 Uhr

      So ein schmarn. Aber danke :)


    • Sven
      am 26. Januar 2009 um 17:38 Uhr

      “===” ist auch schneller als “==”.
      Also kann ich jedem nur empfehlen “===” zu benutzen wo es nur geht :)

      Gruß Sven


    • Ulf
      am 26. Januar 2009 um 18:17 Uhr

      Hi Sven,
      gibt es dazu auch einen Link / Beleg, denn dass würde mich nämlich sehr interessieren! :)

      Viele Grüße
      Ulf


    • Lukas
      am 26. Januar 2009 um 18:47 Uhr

      Aber wer kommt denn auf die Idee, zu testen ob ein String äquivalent zu 0 ist?


    • Sven
      am 26. Januar 2009 um 18:58 Uhr

      z.B. http://www.phpbench.com/ unter “Control Structures”.
      Kannst dir natürlich auch eigene Tests schreiben.

      Gruß Sven


    • admin
      am 26. Januar 2009 um 19:58 Uhr

      @Lukas, das passier wohl eher aus Versehen, wenn man was mit den Usereingaben vergessen hat. Casten z.B.


    • Lukas
      am 26. Januar 2009 um 20:06 Uhr

      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.


    • Ulf
      am 27. Januar 2009 um 19:22 Uhr

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

      Viele Grü0e
      Ulf


    • Johannes
      am 28. Januar 2009 um 12:27 Uhr

      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.

    RSS-Feed für Kommentare zu diesem Artikel. TrackBack-URL

    Einen Kommentar hinterlassen

    Werbung
    PHP Magazin
    Ausgabe 02/2010

    Dieses Mal mit Artikeln zu den Themen OpenSocial und Apache Shindig, Graphentheorie, Smarty3

    t3n
    Ausgabe 19

    Social Media (R)evolution. Weitere Themen sind noSQL, Crowdsourcing ...

    PHP Journal
    Ausgabe 2/2010

    PHP & Windows optimal nutzen, die besten PHP-CMS im Überblick, Google-API mit Zend Framework nutzen.

    Wir wurden schon öfters gefragt, ob man uns nicht irgendwie unterstützen kann. Die Antwort war immer einfach: Klar! Am einfachsten ist es eure nächsten Einkäufe bei Amazon über unsere Link abzuwickeln. Damit würdet ihr uns schon sehr helfen. Über Co-Autoren freuen wir uns aber noch mehr.