Hi!
Es ist auch nicht hinreichend, auf {Iterator oder IteratorAggregate} zu prüfen, weil es natives PHP-Zeugs gibt, das iterierbar ist und Iterator(aggregate) nicht implementiert (wohl aber Traversable).
Das heißt also, es gibt PHP-Zeugs, das an der Prüfung, die zu erwähntem fatalen Error führt, vorbeiprogrammiert ist?
Es gibt in dem Fall mal keinen Unterschied zwischen Theorie und Praxis. Es ist der Zweck der Existenz des Interfaces Traversable, Auskunft darüber zu geben, ob ein Objekt 'traversierbar' ist. Deshalb ist das auch *die* Prüfung, die zu machen ist, wenn man eben dieses feststellen will.
Nur dass man theoretisch Interfaces im Allgemeinen auch implementieren kann, praktisch dieses eine jedoch nicht selbst, sondern nur die beiden anderen, weil es sonst zum Fatal Error kommt. Ich sehe da einen Unterschied zwischen Theorie und Praxis und dass da was spezielles gebastelt wurde, um etwas Komfort zu bekommen, der mit üblichen programmiertechnischen Mitteln nicht zu erreichen ist.
Wenn man sich sowas selbst nachbauen wollte, nützt einem das mitgliedslose Interface nicht mehr als zur Prüfung auf einen gemeinsamen Vorfahren. Aber anwenden kann man das nicht wirklich, denn ich als PHP-Anwender kann nicht mit einem Fatal Error verhindern, dass das mitgliedslose Interface in anderen Klassen implementiert wird. Somit bieten andere Klassen nichts, worauf ich mit beziehen kann. Es sei denn, ich zusätzlich prüfe auf genau definierte Nachfahren dieses Interfaces, um deren Mitglieder verwenden zu können. Nachfahren, die jemand anderes erstellt, kann ich nicht verwenden, weil ich ja deren Mitglieder nicht kenne. Und einen Fehler kann ich auch erst zur Laufzeit werfen und nicht wie PHP bei Traversable schon zur Compile-Zeit.
Lo!