dire que j'ai une classe comme: et j'ai eu d'autres classes comme: p> y a-t-il un moyen d'obtenir Les enfants (Somenewclass & OneOtherNewClass) basés sur la classe ObjectModel? P> P>
3 Réponses :
Vous pouvez itérer toutes les classes retournées par Mais - cela ne fonctionnera pas lorsque vous utilisez AutoLoading. P> get_declared_classes () code> et inspecter leur réflexion (
réflexion :: issubclassof code>) p>
Vous ne savez pas si cela va être évité, mais vous pouvez pirater votre chemin à travers: P>
get_declared_classes code> li>
-
get_parent_class code> pour chaque classe sur 1 li>
ol>
Ce n'est pas joli, mais si les classes d'enfants sont chargées, c'est possible. P>
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 Yes, you can do it, DEMO
Si quelque ouvertureNewClasslol code> étend
quelque ouvertureNewClass code> Vous obtiendrez le même résultat.
@ALIXaxEL Si quelque purtuneNewClassLol s'étend quelque autre point de vue, vous étendez également ObjectModel, puis ses méthodes / propriétés non privées peuvent être utilisées.
@Alixaxel Dans ce cas, quelque puréeNewClasslol code> est toujours hériter
objetmodel code>. Il aura toujours accès à des méthodes / propriétés créées dans
ObjectModel Code> car il s'agit toujours d'un descendant, même si un petit-enfant.
Il suffit de dire qu'il a demandé aux enfants de la classe (pas de grands-enfants), également son exemple de code ne suggère pas qu'il veuille aller au-dessus de 1 niveau d'héritage.
Oui, niveau, le niveau serait suffisant. Mais la capacité d'obtenir des grands-enfants aussi est cool!
Non, vous ne pouvez pas faire cela directement. Pourquoi avez-vous besoin de cela? Un moyen raisonnable de le faire est de garder une trace de ceci dans un fichier de configuration distinct, mais c'est un peu fastidieux. Le point d'héritage est de masquer les détails, demandant à la chaîne d'héritage est en conflit direct avec cet objectif. Vous ne devriez pas avoir à savoir.
Vous pouvez enregistrer de nouveaux enfants via
parent :: __ construire () code> mais cela peut être maladroit. Pouvez-vous clarifier votre intention?
Je construis un PHP-CMS. Et chaque modèle hérite de l'objetmodel. Maintenant, si un contrôleur devrait rechercher un modèle spécifique, qui pourrait être à un chemin dynamique, il serait agréable de rechercher cette classe et de l'utiliser. E.g: le modèle de somènewclass pourrait être sous /_components/sample/_models/somenewclass.php ou il pourrait être sous /_brain/_components/navigation/_models/somenewclass.php
Vous pouvez obtenir une liste de toutes les classes déclarées 'get_declared_classes ()' et itérer via cette liste avec 'instance_of'