2013-05-21 22 views
7

Say mam klasy takich jak:Pobierz wszystkie rozszerzonych klasy w PHP

<? 
class ObjectModel { 
} 

i mam kilka innych klas jak:

<? 
class SomeNewClass extends ObjectModel { 
} 

class SomeOtherNewClass extends ObjectModel { 
} 

Czy istnieje sposób, aby dzieci (SomeNewClass & SomeOtherNewClass) na podstawie klasy ObjectModel?

+0

Nie, nie możesz tego zrobić bezpośrednio. Dlaczego tego potrzebujesz? Rozsądnym sposobem na to jest śledzenie tego w oddzielnym pliku konfiguracyjnym, ale to nużące. Celem dziedziczenia jest ukrywanie szczegółów, żądanie łańcucha dziedziczenia jest bezpośrednio sprzeczne z tym celem. Nie powinieneś wiedzieć. – Halcyon

+0

Możesz zarejestrować nowe dzieci przez 'parent :: __ construct()', ale to może być niezgrabne. Czy możesz wyjaśnić swoją intencję? –

+0

Buduję PHP-CMS. I każdy model w nim dziedziczy po ObjectModelu. Teraz, jeśli kontroler powinien szukać określonego modelu, który mógłby znajdować się na dynamicznej ścieżce, dobrze byłoby poszukać tej klasy i użyć jej. np .: model SomeNewClass może być pod /_components/sample/_models/somenewclass.php lub może być pod/_brain/_components/navigation/_models/somenewclass.php –

Odpowiedz

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 

Tak, można to zrobić, DEMO

+1

Jeśli 'SomeOtherNewClassLol' rozszerzy' SomeOtherNewClass', uzyskasz taki sam wynik. –

+0

@AlixAxel Jeśli SomeOtherNewClassLol rozszerza SomeOtherNewClass, rozszerzasz także ObjectModel, wówczas można używać jego metod/właściwości nieprywatnych – Sam

+0

@AlixAxel W takim przypadku 'SomeOtherNewClassLol' nadal dziedziczy' ObjectModel'. Nadal będzie miał dostęp do metod/właściwości stworzonych w 'ObjectModel', ponieważ nadal jest potomkiem, nawet jeśli jest wnukiem. –

3

Można iteracyjne wszystkich klas zwracanych przez get_declared_classes() i kontroli ich odbicie (Reflection::isSubclassOf)

Ale - to nie będzie działać, gdy używasz automatyczne ładowanie.

0

Nie wiem, czy to się dzieje, aby downvoted ale można włamać się na swój sposób poprzez:

  1. get_declared_classes
  2. get_parent_class dla każdej klasy 1

To nie jest ładna, ale jeśli klasy dziecięce są załadowane, jest to możliwe.