Hi!
is_object() reicht da aber auch noch nicht, denn auf instanceof Iterator und IteratorAggregate sollte ebenfalls geprüft werden.
Nicht notwendig, da beide Interfaces von Traversable erben. Der Test auf dieses Interface reicht aus, um zu entscheiden, ob ein Objekt mit foreach iterierbar ist.
Das Traversable wurde ja gestern schon erwähnt, allerdings ist das theoretisch nicht in jedem Fall. Es stimmt schon, dass die beiden Interfaces Iterator und IteratorAggregate von Traversable erben, und Traversable für diesen Zweck der einfachen Prüfung vorgesehen ist, aber da es selbst keinerlei Mitglieder definiert, dürfte es für foreach schwer werden, ein Objekt zu iterieren, das allein von Traversable erbt. Praktisch stellt sich diese Frage allerdings nicht, weil es einen Fatal Error gibt, wenn man allein Traversable implementieren will.
class Foo implements Traversable { }
Fatal error: Class Foo must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown on line 0
Man hat also ein Interface, das man zwar prüfenderweise verwenden es aber nicht selbst implementieren kann ... Sieht etwas verkorkst aus, aber wenn's hilft.
Lo!