31 votes

Obtenir toutes les classes définies d'une classe parent en php

Je dois déterminer, après l'inclusion de tous les fichiers, quelles classes étendent une classe parente, donc :

class foo{
}
class boo extends foo{
}
class bar extends foo{
}

et j'aimerais pouvoir récupérer un tableau comme :

array('boo','bar');

32voto

MikeSchinkel Points 1717

Prendre la réponse de Wrikken et la corriger en utilisant la suggestion de Scott BonAmi et vous obtenez :

$children = array();
foreach( get_declared_classes() as $class ){
  if( is_subclass_of( $class, 'foo' ) )
    $children[] = $class;
}

Les autres suggestions de is_a() et instanceof ne fonctionnent pas pour cela car les deux s'attendent à une instance d'un objet, pas un nom de classe.

27voto

Wrikken Points 37727

Si vous avez besoin de cela, cela sent vraiment le mauvais code, la classe de base ne devrait pas avoir besoin de le savoir.

Cependant, si vos définitions ont été incluses (c'est-à-dire que vous n'avez pas besoin d'inclure de nouveaux fichiers avec des classes que vous pourriez avoir), vous pourriez exécuter :

$children  = array();
foreach(get_declared_classes() as $class){
    if($class instanceof foo) $children[] = $class;
}

7voto

SteAp Points 5498

Utilisez

$allClasses = get_declared_classes();

pour obtenir une liste de toutes les classes.

Ensuite, utilisez la fonction de Réflexion de PHP pour construire l'arbre d'héritage.

3voto

Ahmad Hajjar Points 1499

Je suis assez sûr que la solution suivante ou quelque chose comme ça serait bien adaptée à votre problème. À mon avis, vous pouvez faire ce qui suit (qui est une sorte de modèle observateur) :

1- Définissez une interface appelée Fooable

interface Fooable{
    public function doSomething();
}

2- Toutes vos classes cibles doivent implémenter cette interface :

class Fooer implements Fooable{
    public function doSomething(){
         return "faire quelque chose";
    }
}

class SpecialFooer implements Fooable{
    public function doSomething(){
         return "faire quelque chose de spécial";
    }
}

3- Créez une classe enregistreur appelez-la FooRegisterar

class FooRegisterar{
    public static $listOfFooers =array();

    public static function register($name, Fooable $fooer){
         self::$listOfFooers[$name]=$fooer;
    }
    public static function getRegisterdFooers(){
         return self::$listOfFooers;
    }
}

4- Quelque part dans votre script de démarrage ou dans un script inclus dans le script de démarrage :

FooRegisterar::register("Fooer",new Fooer());
FooRegisterar::register("Special Fooer",new SpecialFooer());

5- Dans votre code principal :

class FooClient{

    public function fooSomething(){
         $fooers = FooRegisterar::getRegisterdFooers();
         foreach($fooers as $fooer){
              $fooer->doSomthing();
         }
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X