Мне нужно определить, после того, как все файлы были включены, какие классы расширяют родительский класс, поэтому:
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(); } } }