2017-09-10 13 views
2

Ich hätte gerne iterierbare Objekte, die einer Schnittstelle entsprechen, aber ich möchte die Wahl lassen, wie die Iterabilität implementiert werden soll (indem beispielsweise Iterator oder IteratorAggregate implementiert wird).Ist es möglich, eine Schnittstelle zu implementieren, die Traversable erweitert?

Ich dachte, das den Trick tun könnte:

interface IsTraversable extends Traversable { 
    // some other stuff here 
} 

class A implements IsTraversable, IteratorAggregate { 
    function getIterator() { 
     return new ArrayIterator(array()); 
    } 
} 

aber es wirft:

Class A must implement interface Traversable as part of either Iterator or IteratorAggregate 

Die Nachricht ein wenig verwirrend ist, wie IteratorAggregate implementiert ist. Es scheint, dass es eher versucht, mir zu sagen, dass ich Traversable nicht direkt implementieren kann.

Ist es möglich, meine Anforderung zu implementieren?

Antwort

1

Wenn Sie Traversable erweitern, müssen Sie zuerst IteratorAggregate in der Liste der Implementierungen auflisten. Per der PHP manual:

This is an internal engine interface which cannot be implemented in PHP scripts. Either IteratorAggregate or Iterator must be used instead. When implementing an interface which extends Traversable, make sure to list IteratorAggregate or Iterator before its name in the implements clause.

Hervorhebung von mir. Dadurch wird kein Fehler ausgegeben:

<?php 
interface IsTraversable extends Traversable { 
    // some other stuff here 
} 

class A implements IteratorAggregate, IsTraversable { 
    function getIterator() { 
     return new ArrayIterator(array()); 
    } 
} 
Verwandte Themen