dedlfix: Ducktype

Beitrag lesen

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).

class Duck {
  function 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.

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.

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.