противоречивое поведение DirectoryIterator + FilterIterator в PHP? - PullRequest
1 голос
/ 18 января 2010

Я написал сценарий, который использует класс 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 навсе файлы. Что случилось с DAT?

Ответы [ 2 ]

2 голосов
/ 20 января 2010

Похоже, что это действительно нормально! Вызов методов для, казалось бы, пустых объектов DirectoryIterator работает. Проблемы, которые у меня были, были в другом месте и были связаны с клонированием этих объектов. Кажется, PHP 5.3 клонирует глубоко, в то время как 5.2 не так, что все ссылки будут уничтожены на каждой итерации (или что-то в этом роде). Это ужасный, недокументированный беспорядок: PHP отстой!

0 голосов
/ 18 января 2010

с PHP.net:

  • Примечание. Начиная с PHP 5.3.0, это расширение больше нельзя отключить, поэтому оно всегда доступно.

Возможно, ваша конфигурация PHP 5.2.5 каким-то образом неполная / неправильная? У вас в журнале ошибок установлен уровень отображения предупреждений? Если нет, настройте его и снова запустите свой код, чтобы увидеть, не выдает ли он какие-либо предупреждения ...

...