2013-05-21 19 views
7

dire che ho ottenuto una classe come:Ottenere tutte le Classi estesi in PHP

<? 
class ObjectModel { 
} 

e ho avuto alcune altre classi come:

<? 
class SomeNewClass extends ObjectModel { 
} 

class SomeOtherNewClass extends ObjectModel { 
} 

C'è un modo per ottenere i bambini (SomeNewClass & SomeOtherNewClass) basato sulla classe ObjectModel?

+0

No, non è possibile farlo direttamente. Perchè ti serve? Un modo ragionevole per farlo è di tenerne traccia in un file di configurazione separato, ma è un po 'noioso. Il punto di ereditarietà è quello di nascondere i dettagli, richiedendo che la catena ereditaria sia in conflitto diretto con quell'obiettivo. Non dovresti saperlo. – Halcyon

+0

È possibile registrare nuovi figli tramite 'parent :: __ construct()' ma potrebbe essere goffo. Puoi chiarire la tua intenzione? –

+0

Sto costruendo un PHP-CMS. E ogni modello in esso eredita da ObjectModel. Ora, se un controller dovesse cercare un modello specifico, che potrebbe trovarsi su un percorso dinamico, sarebbe bello cercare quella classe e usarla. ad esempio: il modello SomeNewClass potrebbe essere in /_components/sample/_models/somenewclass.php oppure potrebbe essere in /_brain/_components/navigation/_models/somenewclass.php –

risposta

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 

Sì, è possibile farlo, DEMO

+1

Se 'SomeOtherNewClassLol' estende' SomeOtherNewClass' otterrai lo stesso risultato. –

+0

@AlixAxel Se SomeOtherNewClassLol estende SomeOtherNewClass, si estende anche ObjectModel, quindi è possibile utilizzare i suoi metodi/proprietà non private – Sam

+0

@AlixAxel In tal caso, 'SomeOtherNewClassLol' sta ancora ereditando' ObjectModel'. Avrà comunque accesso ai metodi/proprietà creati in 'ObjectModel' in quanto è ancora un discendente, anche se un nipotino. –

3

È possibile scorrere tutte le classi restituiti da get_declared_classes() e ispezionare la loro riflessione (Reflection::isSubclassOf)

Ma - questo non funzionerà quando si utilizza caricamento automatico.

0

Non sono sicuro se questo sta per ottenere downvoted ma si può incidere il vostro senso attraverso:

  1. get_declared_classes
  2. get_parent_class per ogni classe 1

Non è bello, ma se il le classi figlio sono caricate, è possibile.

Problemi correlati