am 10. September 2008
Ich liebe die Objektorietierung und den berühmt gewordenen Satz “everything is an object” von Bruce Eckel habe ich habe ich mir sozusagen virtuell auf die Stirn tätowieren lassen. Aus diesem Grund war ich auch der erste, der auf dem Tisch getanzt hat, als das typeginting mit PHP5 eingeführt wurde. Endlich hatte man den ersten Schritt in Richtung Typsicherheit gemacht. Die schwache Typisierung von PHP stört mich bei den Basistypen wie String, Interger oder Boolean keinesfalls, nur leider klappt das Handling bei Objekten nicht immer auf diese Weise.
Aber PHP wäre ja nicht PHP, wenn sie nicht mal wieder eine Kleinigkeit angebaut hätten, die mich mal wieder zum Stutzen bringt. Ich fange einfach mal mit einem einfachen Beispiel an. Wir haben folgenden einfachen Code:
class A
{
}
class B
{
}
class C
{
public function doSthWithA( A $a )
{
}
}
Ich würde mal sagen, dass wir hier das einfachste Beispiel für das Typehinting bei Funktion in PHP haben. So fangen wir mal an uns aufzuregen:
$a = new A;
$c = new C;
$c->doSthWithA( $a );
Dieser Codesnipet zeigt wunderbar wie schön PHP mit seinem “neuen” Feature umgeht. Der Code läuft ohne abzubrechen durch, da wir alle Regeln die in Klasse definiert wurden befolgen. So weit so gut. Sind wir jetzt aber mal frech und geben der doSthWithA Methode doch einfach ein Objekt vom Typ B mit.
$b = new B;
$c = new C;
$c->doSthWithA( $b );
Ganz klar, was der geschulte Informatiker jetzt erwarten würde. Ich habe der Methode gesagt, dass sie nur mit der Klasse A oder ihrer Kinder zurecht kommt, also muss ein Fehler auftauchen. Aber neeeee … PHP gibt zwar eine Nachricht aus, das hier etwas nicht stimmt, trotzdem macht er mit dem Wert, den er bekommt einfach weiter, in der Hoffnung, dass es schon klappen wird. Also meiner Meinung nach ist das nicht nur einfach falsch, sondern auch eine große Sicherheitslücke.
Aber zum Glück habe ich gerade rausgefunden, dass PHP in den neueren Versionen nicht mehr reagiert, wie ich gerade beschrieben habe. Die Jungs von PHP scheinen also auch dazu zu lernen. Bravo. Ab jetzt wird ein catchable fatal error geworfen. Macht zwar meiner Meinung nach auch nicht so viel Sinn, denn hier liegt ganz klar ein Programmierfehler vor, wenn so ein Error auftaucht, den man auch nicht fangen sollte, sondern ihn umgehen muss.
Also als Fazit kann man sagen, dass Typehining ein Feature ist, dass PHP wirklich eine eine neue Liga befördert, die Umsetzung ist aber wieder nur halbherzig geworden.