7
votes

Obtenez toutes les classes étendues en PHP

dire que j'ai une classe comme: xxx

et j'ai eu d'autres classes comme: xxx

y a-t-il un moyen d'obtenir Les enfants (Somenewclass & OneOtherNewClass) basés sur la classe ObjectModel?


4 commentaires

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 () 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'


3 Réponses :


4
votes

Vous pouvez itérer toutes les classes retournées par get_declared_classes () et inspecter leur réflexion ( réflexion :: issubclassof )

Mais - cela ne fonctionnera pas lorsque vous utilisez AutoLoading.


0 commentaires

2
votes

Vous ne savez pas si cela va être évité, mais vous pouvez pirater votre chemin à travers:

  1. get_declared_classes
  2. get_parent_class pour chaque classe sur 1

    Ce n'est pas joli, mais si les classes d'enfants sont chargées, c'est possible.


0 commentaires

13
votes
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

5 commentaires

Si quelque ouvertureNewClasslol étend quelque ouvertureNewClass 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 est toujours hériter objetmodel . Il aura toujours accès à des méthodes / propriétés créées dans ObjectModel 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!