Duck Typing
Obwohl duck typing keine Technik ist, die man in PHP einsetzt, denke ich doch, dass man mal einen Artikel drüber verfassen kann. Da Ruby, einer der größten Konkurrenten von PHP, diese Art zu typisieren verwendet wollte ich erst recht mal ein paar Worte hierzu verlieren. Wie gesagt, ich mag den Blick über den Tellerrand.
„When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.“
Im Grunde genommen beschriebt dieses Gedicht genau die Funktionweise des duck typings und wie man sich vielleicht bereits denken kann stammt der Name wirklich von diesen Zeilen von James Whitcomb Rileys ab. Bei dieser Technik wird zur Laufzeit überprüft, ob ein Objekt die benötigten Merkmale besitzt. Definiert man zum Beispiel einen Transmogrifier (TM) – ihr werdet euch jetzt fragen was so ein Transmogrifier macht, aber was macht so ein Teil nicht … Ok wieder zurück zum Thema. Wir haben also den TM, diesen kennzeichnet, dass man sich reinsetzen kann, er also die Funktion sitIn( )
besitzt. Des Weiteren muss es transmogrifizieren können transmogrify( )
. In PHP müsste ich jetzt ein Interface defnieren und alle Klassen davon ableiten, die ein Transmogrifier sein sollen. Beim Duck Typing reicht es hingegen schon, dass diese Funktionen vorhanden sind. Dies wird zur Laufzeit ermittelt. Alle Klassen, die dieses zwei Methoden implementieren sind also von Typ eines Transmogrifiers und können auch in diesem Kontext benutzt werden.
Ok, der Ansatz ist klar, aber wo sind jetzt die Vorteile bei dieser Art Interfaces zu deklarieren. Ein großer Vorteil ist, dass ich mit Objekten hantieren kann, die alle benötigten Eigenschaften mit sich bringen, aber nicht explizit vom gewünschten Typ sind. Klingt ja eigentlich ganz nett. Das Problem dabei ist aber, dass nicht alles, was wie eine Ente aussieht, läuft wie eine Ente und quaked wie eine Ente wirklich eine Ente ist. Vielleicht ist es auch ein Drache, der sich in eine Ente verwandelt hat. Und will mal so einen in seinem Teich haben? Ich muss dazu sagen, dass ich das Beispiel aus der englischen Wikipedia genommen habe, aber ich fand’s eigentlich ganz nett. Ich glaube auch, dass man ziemlich schnell den Überblick verlieren kann, welchen Typen denn jetzt nun in einem Projekt existieren. Aber vielleicht haben wir ja das Glück und ein erfahrener Duck Typer liest diesen Text und kann ein paar Worte hierzu verfassen.
Ich bin gerade am überlegen, ob man mit den Bordmitteln von PHP auch eine Art Duck Typing hin bekommen kann. Eigentlich sollte ja schon alles nativ unterstützt werden. Ich glaube ich werde die nächste Zeit mal ein wenig mit der Idee spielen und dann, wenn ich vielleicht zu einem Ergebnis gekommen bin, werde ich es auch wissen lassen.