I wrote a script that is using the FilterIterator class that comes from the Standard PHP Library (SPL) and I get different behabours accross PHP 5.x versions :( Here the accept() function:
public functi开发者_运维问答on accept()
{
$current = $this->current();
print_r($current);
return true;
}
and heres its output for 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] =>
)
and heres what I get with the same code under PHP 5.2.5
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
DirectoryIterator Object
(
)
The latter has permission 755 on all files. Whats up with dat?
Seems like this is actually OK! Calling methods on the seemingly empty DirectoryIterator objects works. The issues I was having were elsewhere and had to do with cloning these objects. Seems PHP 5.3 clones deep while 5.2 don't so all the references get killed on each iteration (or something like that). Its an ugly, un-documented mess: PHP sucks!
From PHP.net:
- Note: As of PHP 5.3.0 this extension can no longer be disabled and is therefore always available.
Possibly your PHP 5.2.5 configuration is in some way incomplete/wrong? Do you have your error log leve set to display warnings? If not, adjust it and run your code again to see if its throwing any warnings ...
精彩评论