4

別の親クラスを拡張した宣言済みクラスをすべて取得する必要があります。

たとえば...

class ParentClass {

}

class ChildOne extends ParentClass {

}

class ChildTwo extends ParentClass {

}

class ChildThree {

}

これを出力する配列が必要です:

array('ChildOne', 'ChildTwo')

私はPHPOOPを初めて使用しますが、いくつかのグーグルに基づいて、このソリューションを思いつきました。

$classes = array();

foreach( get_declared_classes() as $class ) {
    if ( is_subclass_of($class, 'ParentClass') ){
        array_push($classes, $class);
    }
}

私が聞きたいのは、これが私がやりたいことを行うためのベストプラクティスなのか、それとももっと良い方法があるのか​​ということです。グローバルスコープには、の子ではない他の多くのクラスが含まれますParentClass。宣言されたすべてのクラスをループするのが最善の方法ですか?

編集 (目的の明確化)

これで達成したいのは、親クラスを拡張する各子クラスをインスタンス化することです。

$childone = new ChildOne; $childtwo = new ChildTwo;のすべての子供のためにやりたいですParentClass

4

2 に答える 2

2

クラスが最初にロードされたときに、クラスの宣言をログに記録することができます。自動読み込みを使用していると仮定します。

コンポーザーではなくカスタムローダーを使用する場合:

それが最も簡単な方法です:

$instanciatedChildren = array();//can be a static attribute of the A class 
spl_autoload_register(function($class)use($instanciatedChildren){
   //here the code you use 
   if(is_subclass_of($class,'A')){
       $instanciatedChildren[] = $class;
   }
 }

作曲家を使用する場合:

可能です。拡張するクラスを作成してcomposer/src/Composer/Autoload/ClassLoader.php から、loadClassメソッドをオーバーライドして、上記の条件を追加します。次に、新しいローダーを登録し、古いローダーの登録を解除します。

于 2012-11-27T16:31:57.453 に答える
1

なぜこれを行うのかはわかりませんが、あなたの解決策は問題ないようです。PHPには、宣言された各クラスを実際にグローバルにチェックせずに、「特定の親クラスの宣言されたすべてのクラスをグローバルに提供する」と言う簡単な方法はありません。ループするために数百のクラスがロードされている場合でも、それらはすべてメモリ内にあるため、それほど重くはありません。

特定の親のロードされた子クラスを追跡しようとしている場合は、ロード時にそれらを追跡するレジストリを作成してみませんか?クラス定義の前にクラスファイルの先頭に何かを置くだけで、子クラスまたはイベントにハックとして使用されるオートローダーまたはファクトリでこの追跡を行うことができます。

于 2012-11-27T15:53:45.593 に答える