1
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
print_r($objects);   

これは出力のみ

RecursiveIteratorIterator オブジェクト ( )

しかし、次のように同じオブジェクトをループすると

foreach($objects as $name => $object){
    echo "$name\n";
}

次に、期待どおりにすべてのファイルとフォルダーが表示されます。

質問:オブジェクトが作成された後でも空白が表示されるのはprint_rなぜですか? var_dumpしかし、そのループはすべてのデータを示しています。foreach実行時にそれらをループしますか? それは通常のforeach仕組みではありません。また、var_dumpまたはprint_r他のほとんどすべてのものについて、オブジェクトに含まれるすべてのものを伝えるという事実も、なぜこれについてではないのでしょうか?

4

1 に答える 1

4

foreachは 2 種類のデータを操作できます。ネイティブと、任意のインターフェイスをarray実装するオブジェクト、つまりとです。TraversableInteratorAggregateIterator

これらのインターフェースを実装する場合、foreachループは、必要なデータの発行をトリガーする特定のメソッドを呼び出します。これは、メソッドが呼び出されない限り、データが存在しない可能性があることを意味します。したがって、データがそこにない場合、ダンプすることはできません。また、最初にオブジェクトを反復処理してからデータをダンプしようとすると、保存されない可能性があります。

これはすべて意図的なものです。通常、適切なオブジェクトは、明示的に指示されるまで動作を開始しません。特に優れたコンストラクターは、パラメーターを内部に格納してから完了する以外の作業を行いません。

したがって、 を作成した後RecursiveDirectoryIterator、そのオブジェクトは、後で調査する必要があるパスを保存しただけです。また、それをダンプすると、内部的に保存されたデータを PHP 内部で実装されたオブジェクトから取得するという問題が発生します。ダンプできる PHP データ構造はありません。

要するに、PHPコアまたは拡張機能内に実装されたオブジェクトをダンプできますが、検出できるのはオブジェクトの存在のみであり、コンテンツは検出できません。これはデバッグに影響し、良くありませんが、悲しいことに PHP の現在の状態です。

于 2013-10-20T14:41:36.387 に答える