Ducktyping in PHP?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ducktyping in PHP?

    Hi,

    Gibt es in PHP auch eine Art Ducktyping für iterierende Dinge? Hauptsache man kann es mit foreach durchlaufen, egal ob es ein Array oder ein Objekt ist...
    Nur wie kann man das kontrollieren?

    greez

    bitsnack
  • Der durchschnittliche PHP Code nutzt doch schon implizit Ducktyping.
    Immer wenn eine Methode ein Objekt als Parameter nimmt, das keinen bestimmten Typ forciert (Type Hinting), aber dennoch voraussetzt, dass es sich irgendwie verhält, dann ist das Duck Typing.

    mit Ducktyping:

    Quellcode

    1. class DucktypingExample {
    2. function add($h) {
    3. $this->list[] = $h;
    4. }
    5. function getNames() {
    6. $names = '';
    7. foreach($this->list as $h) {
    8. $names .= $h.',';
    9. }
    10. return rtrim($h, ',');
    11. }
    12. }
    Alles anzeigen



    ohne Ducktyping:

    Quellcode

    1. class ...
    2. function add(Mensch $h) {
    3. $this->list[] = $h;
    4. }


    Was hat Ducktyping nun mit Iteratoren zutun? Ich mutmaße mal die Antwort auf deine Frage ;)
    Also iteriert man über eine Instanz dann iteriert man per default über alle public Variablen.
    Wenn du das Verhalten überschreiben willst, musst du einfach nur das Interface Iterator implementieren.

    Hier das Beispiel wie du über ein Array Objekt iteriertst:

    Quellcode

    1. class IteratorExample implements Iterator {
    2. private $myArray;
    3. public function __construct( $givenArray ) {
    4. $this->myArray = $givenArray;
    5. }
    6. function rewind() {
    7. return reset($this->myArray);
    8. }
    9. function current() {
    10. return current($this->myArray);
    11. }
    12. function key() {
    13. return key($this->myArray);
    14. }
    15. function next() {
    16. return next($this->myArray);
    17. }
    18. function valid() {
    19. return key($this->myArray) !== null;
    20. }
    21. }
    Alles anzeigen
  • Kann gut sein dass ich mich falsch ausgedrückt habe:
    Ich habe eine Variable und möchte herausfinden, ob man diese mit foreach durchlaufen kann. Dabei soll es egal sein ob es ein Array ist, oder einfach nur ein Iterator (als Klasse mit eben den Methoden key, rewind... etc.
    Klar würde es irgendwie so gehen:
    if is_array($var) or (method_exists($var, 'rewind') and method_exists($var, 'key') and ... then
    foreach $var as $babe
    ...

    Aber geht das nicht auch irgendwie einfacher? Theoretisch müsste ich ja nur kontrollieren ob es ein Array ist oder ob es das Iterator-Interface implementiert.
    Damit wäre meine Frage auch schon geklärt, ausser es würde irgendwie einfacher gehen...

    Aber Vielen Dank schonmal!

    PS: Immer wenn ich ein Problem poste komm ich kurz daraufhin selbst auf die Lösung ^^
  • Vielleicht wäre es möglich, das Objekt einfach mal testweise zu iterieren und dann die, falls das Objekt nicht iterierbar ist, geworfene Exception zu fangen und entsprechend zu behandeln. So könntest du herausfinden, ob ein Objekt iterierbar ist oder nicht. Wäre vielleicht nicht die sauberste Lösung, aber eine Methode, die überprüft, ob ein Objekt iterierbar ist, habe ich bisher auch noch nicht gefunden.
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • bitsnack schrieb:


    Aber geht das nicht auch irgendwie einfacher? Theoretisch müsste ich ja nur kontrollieren ob es ein Array ist oder ob es das Iterator-Interface implementiert.


    Na du sagst doch schon die Lösung.

    Schreib doch einfach eine Operationen blabla(Iterator i) .
    Ich habe zwar kaum Ahnung von PHP aber in einer Objektorientierten Skript/Programmiersprache sind implementierungen gegen Schnittstellen doch gang und gebe, oder?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von F0kus ()