Ducktype
bearbeitet von
Tach!
> "Wenn es quakt wie eine Ente, dann wird es wohl eine Ente sein", heißt der Spruch. Das beeinhaltet, dass es auch ein Fuchs sein kann, der wie eine Ente quakt. Das ist dem Programm an der Stelle aber egal, es will nur die Funktionalität des Quakens haben.
Konkretes Beispiel für PHP: Die Aufgabenstellung ist, sicherzustellen dass man ein passendes Objekt bekommt.
Methode 1: Type Hinting. Der Parser/Compiler schreit, wenn es nicht passt. Alles was übergeben wird, muss von diesem Typ sein (statt Klasse geht auch Interface).
~~~php
class Duck {
quack();
}
function foo(Duck $duck) {
$duck->quack();
}
foo(new Duck()); // quakt
foo(new Person()); // Fehlermeldung
~~~
Methode 2: einfacher Parameter ohne Typangabe, Prüfung zur Laufzeit im Code.
~~~php
function foo($duck) {
if ($duck instanceof Duck) {
$duck->quack();
}
}
foo(new Duck()); // quakt
foo(new Person()); // quakt nicht
~~~
Methode 3: Duck typing. Hier mit Prüfung. Man kann die auch weglassen, dann gibt es eben einen Laufzeitfehler, wenn die Methode nichtg existiert.
~~~php
function foo($duck) {
if (method_exists($duck, 'quack') {
$duck->quack();
}
}
class Duck {
function quack() {...}
}
class Person {
function quack() { play_duck_sound(); }
}
class Tree {
}
foo(new Duck()); // quakt
foo(new Person()); // quakt auch
foo(new Tree()); // quakt nicht, kann es nicht und auch nicht nachmachen
~~~
dedlfix.