2013-05-21 2 views
7

Скажем, у меня есть класс, как:Получить все расширенные классы в PHP

<? 
class ObjectModel { 
} 

и я получил некоторые другие классы, как:

<? 
class SomeNewClass extends ObjectModel { 
} 

class SomeOtherNewClass extends ObjectModel { 
} 

Есть ли способ, чтобы получить детей (SomeNewClass & SomeOtherNewClass) на основе класса ObjectModel?

+0

Нет, вы не можете сделать это непосредственно. Зачем тебе это нужно? Разумным способом сделать это - следить за этим в отдельном файле конфигурации, но это довольно утомительно. Точка наследования заключается в том, чтобы скрыть детали, требуя, чтобы цепочка наследования находилась в прямом противоречии с этой целью. Вы не должны знать. – Halcyon

+0

Вы можете зарегистрировать новых детей через 'parent :: __ construct()', но это может быть неудобно. Можете ли вы прояснить свое намерение? –

+0

Я строю PHP-CMS. И каждая модель в нем наследуется от ObjectModel. Теперь, если контроллер должен искать определенную модель, которая может быть на динамическом пути, было бы неплохо искать этот класс и использовать его. например: модель SomeNewClass может находиться под /_components/sample/_models/somenewclass.php, или она может находиться под /_brain/_components/navigation/_models/somenewclass.php –

ответ

11
class ObjectModel { 
} 

class SomeNewClass extends ObjectModel { 
} 

class SomeOtherNewClass extends ObjectModel { 
} 

class SomeOtherNewClassLol extends ObjectModel { 
} 

function get_extends_number($base){ 
    $rt=0; 
    foreach(get_declared_classes() as $class) 
     if(is_subclass_of($class,$base)) $rt++; 
     return $rt; 
} 

echo get_extends_number('ObjectModel'); //output: 3 

Да, вы можете это сделать, DEMO

+1

Если 'SomeOtherNewClassLol' расширяет' SomeOtherNewClass', вы получите тот же результат. –

+0

@AlixAxel Если SomeOtherNewClassLol расширяет SomeOtherNewClass, вы также расширяете ObjectModel, тогда его методы/свойства не являются частными, могут использоваться – Sam

+0

@AlixAxel. В этом случае 'SomeOtherNewClassLol' по-прежнему наследует' ObjectModel'. Он все равно будет иметь доступ к методам/свойствам, созданным в ObjectModel, поскольку он все еще является потомком, даже если он является внуком. –

3

Вы можете перебирать все классы, возвращаемые get_declared_classes() и проверки их отражения (Reflection::isSubclassOf)

Но - это не будет работать, если вы используете автозагрузку.

0

Не уверен, если это будет получить downvoted, но вы можете взломать ваш путь через:

  1. get_declared_classes
  2. get_parent_class для каждого класса на 1

Это не красиво, но если загружаются дочерние классы, это возможно.

Смежные вопросы