Perfekte Konfusion mit Operatoren

Post von realloc | Einsortiert in Code am 26. Oktober 2007 | 2 Kommentare
advertisment

Ich will ja nicht immer nur meckern. Nein, wirklich … ich gebe mir ehrlich Mühe. Aber dieser Stringoperator geht mir wirklich gegen den Strich. Nicht nur, dass die vom php.net in ihrer Dokumentation behaupten, es würde 2 Stringoperatoren (Verkettung $a . $b und Kombination mit Zuweisung $a .= $b) geben … nein, es muss ausgerechnet ein Punkt sein. Das man Strings hin und wieder verkettet, ist mir schon klar. Mach ich auch oft genug. Aber diese Geschichte mit dem Punkt ist ganz klar von Perl abgekupfert. Viele andere Sprachen – die ich so bei der täglichen Arbeit benutze – wie zum Beispiel C++, Python und sogar JavaScript sehen für diese Operation ein + vor, was auch viel logischer ist, wenn man mal etwas darüber nachdenkt.

Das grundsätzliche Problem ist wieder mal die laxe Typisierung von PHP. Bei der Addition von 1 + 1 und auch bei der von “1″ + “1″ erhält man mit PHP immer ein int(2). Das ist noch nicht wirklich spektakulär. Auch die Addition “1a” + “1b” ergibt ebenfalls den Integerwert 2. Der Cast erfolgt also automatisch. Anzumerken ist an dieser Stelle noch, dass dies mit allen arithmetischen Operatoren funktioniert. Allerdings ergibt beispielsweise nur “21a” – “7b” mit PHP ein int(14), während “a21″ – “7b” == -7 und “a21″ – “b7″ == 0 sein soll. Was für ein Durcheinander!

Aber es geht noch schlimmer! Wissen Sie wie man 2 Arrays miteinander verbindet? Man addiert sie einfach mit einem +. Allerdings gibt es auch hier wieder Einschränkungen array (1, 2) + array (3, 4) ergibt array (1, 2), während uns array (1 => 1, 2 => 2) + array (3 => 3, 4 => 4) mit dem Ergebnis array(1 => 1, 2 => 2, 3 => 3, 4 => 4) erfreut. Diese Operation scheint also eher eine Invariante von array_merge zu sein. Nicht die Werte der Elemente sind von Bedeutung, sondern die Werte der Schlüssel werden benutzt.

Bei diesem ganzen Durcheinander und der gelungenen Kompromittierung des +-Operators schien nur noch ein Weg offen zu sein. Ein neuer Operator musste eingeführt und ebenfalls gnadenlos kompromittiert werden. Der .-Operator verbindet Variablen zu Zeichenketten. Und das absolut und gnadenlos! “1″ . “1″ ergibt demnach “11″, aber auch mit 1 . 1 kommt man zum gleichen Ergebnis. Um das Chaos noch perfekt zu machen, können Sie auch versuchen, den .-Operator auf 2 Arrays oder 2 Objects anzuwenden. Das Ergebnis ist je nach Wahl “ArrayArray” oder “”ObjectObject”.

Have fun!

Möglicherweise interessiert Dich auch...



2 Antworten auf “Perfekte Konfusion mit Operatoren”

  1. Thomas sagt:

    Also in meinen Augen ist es durchdacht!
    In PHP gibt es keine explizite typisierung also muss der Typ durch die angewanten Operatoren eindeutig definiert werden.
    1.) Klartext: +-*/ auf eine Variable => muss eine Zahl sein => variablen in Zahlen umwandeln und rechen.
    “a21″ ist == 0 und “b7″ == 0 und da 0-0==0 ist das Ergebnis mehr als Logisch!
    2.) Auf Arrays: es werden natürlich die Indexe “gemergen” und array(1, 2) == array(0=>1, 1=>2) und array(3, 4) == array(0=>3, 1=>4) also muss das ergebniss auch wieder aus zwei werden bestehen!

    Ob du es glaubst oder nicht: die Entwickler von PHP haben mitgedacht!

    PS: 1 . 1 geht sowiso schon… man muss es nur klammern!
    echo (1 . 1);

    Gruß Thomas

  2. realloc sagt:

    Mag alles sein … allerdings habe ich mich über den Punkt-Operator geärgert und dargelegt, warum der bei PHP überhaupt existiert und eine Verkettung von Strings mittels + deshalb nicht möglich ist. ;-)

Einen Kommentar schreiben