Получить все определенные классы родительского класса в php

Мне нужно определить, после того, как все файлы были включены, какие классы расширяют родительский класс, поэтому:

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

и я хотел бы иметь возможность захватить массив вроде:

 array('boo','bar'); 

Если вам это нужно, это действительно пахнет плохим кодом, базовому классу не обязательно это знать.

Однако, если вы включили определения (т.е. вам не нужно включать новые файлы с классами, которые у вас есть), вы можете запустить:

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

Принимая ответ Wrikken и исправляя его с помощью предложения Scott BonAmi, и вы получаете:

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

Другие предложения is_a() и instanceof не работают для этого, потому что оба они ожидают экземпляр объекта, а не имя класса.

использование

$ allClasses = get_declared_classes ();

для получения списка всех классов.

Затем используйте функцию Reflection PHP для построения дерева наследования.

Я почти уверен, что следующее решение или что-то подобное будет хорошо подходить для вашей проблемы. ИМХО, вы можете сделать следующее (это своего рода шаблон наблюдателя):

1- Определить интерфейс, называемый Fooable

 interface Fooable{ public function doSomething(); } 

2- Все ваши целевые классы должны реализовать этот интерфейс:

 class Fooer implements Fooable{ public function doSomething(){ return "doing something"; } } class SpecialFooer implements Fooable{ public function doSomething(){ return "doing something special"; } } 

3- Сделайте класс регистратора, назовите его 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. Где-то в вашем скрипте загрузки или в каком-то скрипте, который включен в сценарий загрузки:

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

5- В вашем основном коде:

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