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');
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');
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.
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;
}
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.
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 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.