Implementing the RecursiveIterator Interface
The
RecursiveIterator
interface extends the existing
Iterator
interface to include two additional
methods:
hasChildren( )
and
getChildren( )
. These methods are used to navigate
through sublists.
If you have an existing Iterator
,
itâs natural to extend
it to
include the additional methods. SPL actually comes with a
RecursiveDirectoryIterator
, so
thereâs no need to add these methods to
DirectoryIterator
, but itâs a
useful exercise to see how these methods should behave.
Hereâs how itâs done:
class MyRecursiveDirectoryIterator extends MyDirectoryIterator implements RecursiveIterator { protected function getPath( ) { return $this->path . DIRECTORY_SEPARATOR . $this->current( ); } public function hasChildren( ) { return is_dir($this->getPath( )); } public function getChildren( ) { return new MyRecursiveDirectoryIterator($this->getPath( )); } }
Wow! This is much shorter than the code that was needed for
iterate_dir( )
. Since you can inherit methods from
your earlier iterator, the implementation is three one-line methods.
The first method, getPath( )
, constructs a
complete pathname from the original path and the current filename. It
uses the $path
property that was stored in the
constructor for MyDirectoryIterator
in Example 6-1 because I knew youâd need it
now.
The other two methods required by the interface also turn out to be
easy to code. A file has children if itâs a
directory, so hasChildren( )
only needs to check the return ...
Get Upgrading to PHP 5 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.