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

これは実際にOKのようです!一見空の 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 に答える