Статьи

Вранье! Проклятая ложь!

Поговорил с Маркусом Бергером по электронной почте о статье PHP 5 Standard Library и должен признаться;)

Маркус делает очень хорошее замечание по поводу примера DirectoryReader, который я использовал;

Ваш DirectoryReader неверен. Это делает пропуск файла не действительным, но это должно быть сделано в следующем ().

Но после необходимых изменений у него все еще есть главный недостаток дизайна. Использует рекурсию. И Итераторы о разворачивании.

Итак, что вы должны сделать, это предотвратить эту рекурсию, и если вы посмотрите на результат и сколько вам потребовалось, чтобы завершить его правильно, вы поймете, почему использование FilterIterator было бы лучше. Это можно использовать для простой фильтрации не файлов, и становится ясно, почему итераторы могут использоваться для функционального программирования — в этом сценарии алгоритм фильтрации, предоставляемый FilterIterator, ничего не знает о ваших данных.

Вот класс задачи плюс код, использующий его;

class DirectoryReader extends DirectoryIterator { function __construct($path) { parent::__construct($path); } function current() { return parent::getFileName(); } function valid() { if ( parent::valid() ) { if ( !parent::isFile() ) { parent::next(); return $this->valid(); } return TRUE; } return FALSE; } function rewind() { parent::rewind(); } } // Create a directory reader for the current directory $Reader = new DirectoryReader('./'); // Loop through the files in the directory ?!? foreach ( $Reader as $Item ) { echo $Item.' '; }

class DirectoryReader extends DirectoryIterator { function __construct($path) { parent::__construct($path); } function current() { return parent::getFileName(); } function valid() { if ( parent::valid() ) { if ( !parent::isFile() ) { parent::next(); return $this->valid(); } return TRUE; } return FALSE; } function rewind() { parent::rewind(); } } // Create a directory reader for the current directory $Reader = new DirectoryReader('./'); // Loop through the files in the directory ?!? foreach ( $Reader as $Item ) { echo $Item.' '; }

class DirectoryReader extends DirectoryIterator { function __construct($path) { parent::__construct($path); } function current() { return parent::getFileName(); } function valid() { if ( parent::valid() ) { if ( !parent::isFile() ) { parent::next(); return $this->valid(); } return TRUE; } return FALSE; } function rewind() { parent::rewind(); } } // Create a directory reader for the current directory $Reader = new DirectoryReader('./'); // Loop through the files in the directory ?!? foreach ( $Reader as $Item ) { echo $Item.' '; }

class DirectoryReader extends DirectoryIterator { function __construct($path) { parent::__construct($path); } function current() { return parent::getFileName(); } function valid() { if ( parent::valid() ) { if ( !parent::isFile() ) { parent::next(); return $this->valid(); } return TRUE; } return FALSE; } function rewind() { parent::rewind(); } } // Create a directory reader for the current directory $Reader = new DirectoryReader('./'); // Loop through the files in the directory ?!? foreach ( $Reader as $Item ) { echo $Item.' '; }

class DirectoryReader extends DirectoryIterator { function __construct($path) { parent::__construct($path); } function current() { return parent::getFileName(); } function valid() { if ( parent::valid() ) { if ( !parent::isFile() ) { parent::next(); return $this->valid(); } return TRUE; } return FALSE; } function rewind() { parent::rewind(); } } // Create a directory reader for the current directory $Reader = new DirectoryReader('./'); // Loop through the files in the directory ?!? foreach ( $Reader as $Item ) { echo $Item.' '; }

class DirectoryReader extends DirectoryIterator { function __construct($path) { parent::__construct($path); } function current() { return parent::getFileName(); } function valid() { if ( parent::valid() ) { if ( !parent::isFile() ) { parent::next(); return $this->valid(); } return TRUE; } return FALSE; } function rewind() { parent::rewind(); } } // Create a directory reader for the current directory $Reader = new DirectoryReader('./'); // Loop through the files in the directory ?!? foreach ( $Reader as $Item ) { echo $Item.' '; }

class DirectoryReader extends DirectoryIterator { function __construct($path) { parent::__construct($path); } function current() { return parent::getFileName(); } function valid() { if ( parent::valid() ) { if ( !parent::isFile() ) { parent::next(); return $this->valid(); } return TRUE; } return FALSE; } function rewind() { parent::rewind(); } } // Create a directory reader for the current directory $Reader = new DirectoryReader('./'); // Loop through the files in the directory ?!? foreach ( $Reader as $Item ) { echo $Item.' '; }

Кто-нибудь хочет взять на себя гантлет и заново внедрить?

Как я понимаю, что говорит Маркус, альтернатива состоит в том, чтобы использовать сам DirectoryIterator , а затем передать его чему-то расширяющему FilterIterator (или, возможно, лучше расширяющему DirectoryFilterDots ) — «спецификация» предназначена для того, чтобы перечислять только файлы в данном каталоге, игнорируя родительский и текущие узлы.