PHPファイルのロードを含むディレクトリを繰り返し処理し、各ファイルにどのようなクラスが定義されているかを検出しようとしています。再帰的イテレータの結果を結合する:親を持つ子どもたち
は、以下を考慮してください
$php_files_and_content = new PhpFileAndContentIterator($dir);
foreach($php_files_and_content as $filepath => $sourceCode) {
// echo $filepath, $sourceCode
}
上記$php_files_and_content
変数キーがファイルパスであり、かつ、例えばから明らかではなかったかのようにコンテンツがファイルのソースコード(あるイテレータを表します)。
これは、ソースコード内のすべての定義されたクラスに一致する別のイテレータ、ALAに供給される:「クラスC」がで定義されたため、$index
が数値的にシーケンシャルされていない理由である
class DefinedClassDetector extends FilterIterator implements RecursiveIterator {
public function accept() {
return $this->hasChildren();
}
public function hasChildren() {
$classes = getDefinedClasses($this->current());
return !empty($classes);
}
public function getChildren() {
return new RecursiveArrayIterator(getDefinedClasses($this->current()));
}
}
$defined_classes = new RecursiveIteratorIterator(new DefinedClassDetector($php_files_and_content));
foreach($defined_classes as $index => $class) {
// print "$index => $class"; outputs:
// 0 => Class A
// 1 => Class B
// 0 => Class C
}
2番目のソースコードファイルが返され、返される配列はインデックス0から再び開始されます。これは、結果の各セットが別々のイテレータ(したがってキーと値のペア)を表すため、RecursiveIteratorIteratorで保持されます。
とにかく、私が今しようとしているのは、これらを組み合わせる最良の方法を見つけることです。つまり、新しいイテレータを反復するとき、鍵はクラス名($defined_classes
イテレータから)元のファイルパス:ala:
foreach($classes_and_paths as $filepath => $class) {
// print "$class => $filepath"; outputs
// Class A => file1.php
// Class B => file1.php
// Class C => file2.php
}
これまでのところ、私はこれまで立ち往生しています。
現時点では、現在の()メソッドをオーバーライドして外部イテレータのキー()(元のファイルパス)とkey()を返す新しいRecursiveIteratorを作成することだけが考えられます)メソッドを使用して現在のiterator()値を返します。それは私のに対し、コードは恐ろしいなりますと、
- :ので、しかし、私はこのソリューションを好むていませんよいくつかの一般的なイテレータを定義し、必要な結果を生成するような方法でそれらを結合できるようにしたいと思います。
任意のアイデアや提案を感謝して受け取った。
私はまた、より効率的で、はるかに高速があります実現これを行う方法、しかしthまた、Iteratorsを使用してコードを再利用するための演習でもあるため、新しいイテレータはできるだけ最小限に抑え、既存の機能を活用するようにしてください。
おかげで
+1バーを上げてPHPでOOPを使う –