противоречивое поведение DirectoryIterator+FilterIterator в PHP?
Вопрос
Я написал сценарий, использующий класс FilterIterator из стандартной библиотеки PHP (SPL), и в версиях PHP 5.x я получаю разные варианты поведения :( Здесь функция Accept():
public function accept()
{
$current = $this->current();
print_r($current);
return true;
}
и вот его вывод для PHP 5.3.1:
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/.
[fileName:SplFileInfo:private] => .
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/..
[fileName:SplFileInfo:private] => ..
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
DirectoryIterator Object
(
[pathName:SplFileInfo:private] => /Users/alex/Sites/dev/php/fscms/content/.DS_Store
[fileName:SplFileInfo:private] => .DS_Store
[glob:DirectoryIterator:private] =>
[subPathName:RecursiveDirectoryIterator:private] =>
)
и вот что я получаю с тем же кодом в PHP 5.2.5
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
Последний имеет разрешение 755 на все файлы.Что с этим?
Решение
Кажется, это действительно нормально!Вызов методов для, казалось бы, пустых объектов DirectoryIterator работает.Проблемы, с которыми я столкнулся, были в другом месте и были связаны с клонированием этих объектов.Кажется, PHP 5.3 клонирует глубоко, а 5.2 - нет, поэтому все ссылки уничтожаются на каждой итерации (или что-то в этом роде).Это уродливый, недокументированный беспорядок:PHP отстой!
Другие советы
Из PHP.net:
- Примечание:Начиная с PHP 5.3.0 это расширение больше нельзя отключить, поэтому оно всегда доступно.
Возможно, ваша конфигурация PHP 5.2.5 в чем-то неполная/неправильная?Установлен ли у вас уровень журнала ошибок для отображения предупреждений?Если нет, настройте его и запустите код еще раз, чтобы увидеть, выдает ли он какие-либо предупреждения...