1

我编写了一个使用来自标准 PHP 库 (SPL) 的 FilterIterator 类的脚本,并且我在 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 权限。怎么回事?

4

2 回答 2

2

好像这样真的没问题!在看似空的 DirectoryIterator 对象上调用方法是可行的。我遇到的问题在其他地方,与克隆这些对象有关。似乎 PHP 5.3 克隆很深,而 5.2 没有,所以所有引用在每次迭代(或类似的东西)时都会被杀死。它是一个丑陋的、没有记录的混乱:PHP 糟透了!

于 2010-01-20T20:59:13.870 回答
0

来自 PHP.net:

  • 注意:从 PHP 5.3.0 开始,此扩展不再被禁用,因此始终可用。

可能您的 PHP 5.2.5 配置在某种程度上不完整/错误?您是否将错误日志级别设置为显示警告?如果没有,请调整它并再次运行您的代码,看看它是否会引发任何警告......

于 2010-01-18T16:53:38.373 回答