Question

Ci-dessous, un exemple de hiérarchie de classes et de code. Ce que je recherche, c’est un moyen de déterminer si "ChildClass1" ou "ChildClass2" utilise la méthode statique whoAmI () l’a appelée sans la ré-implémenter dans chaque classe enfant.

<?php

abstract class ParentClass {

    public static function whoAmI () {

        // NOT correct, always gives 'ParentClass'
        $class = __CLASS__;

        // NOT correct, always gives 'ParentClass'. 
        // Also very round-about and likely slow.
        $trace = debug_backtrace();
        $class = $trace[0]['class'];

        return $class;
    }
}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ParentClass'
// Want to show 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ParentClass'
// Want to show 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";
Était-ce utile?

La solution 3

Maintenant que PHP 5.3 est largement disponible dans la nature, je souhaitais rassembler une réponse synthétique à cette question afin de refléter les nouvelles techniques disponibles.

Comme mentionné dans les autres réponses, PHP 5.3 a introduit Liaison statique tardive via un nouveau statique mot clé. De même, un nouveau get_called_class () Une fonction est également disponible et ne peut être utilisée que dans une méthode de classe (instance ou statique).

Pour déterminer la classe telle qu'elle a été posée dans cette question, la fonction get_called_class () est appropriée:

<?php

abstract class ParentClass {

    public static function whoAmI () {
        return get_called_class();
    }

}

class ChildClass1 extends ParentClass {

}

class ChildClass2 extends ParentClass {

}

// Shows 'ChildClass1'
print ChildClass1::whoAmI(); 
print "\n";

// Shows 'ChildClass2'
print ChildClass2::whoAmI();
print "\n";

Le notes contribuées par l'utilisateur pour get_called_class () inclut quelques exemples d'implémentations qui devraient fonctionner dans PHP 5.2 en utilisant debug_backtrace () .

Autres conseils

Je crois que vous faites référence à un bogue php connu. Php 5.3 vise à résoudre ce problème avec une nouvelle fonctionnalité de liaison statique tardive.

http: // www .colder.ch / news / 08-24-2007 / 28 / late-static-bindings-expl.html

L’identification de classe est souvent le symptôme d’un polymorphisme mal compris.

Les clients de ChildClass1 et de ChildClass2 ne devraient pas avoir besoin de les distinguer.

Il n'y a aucun endroit où une classe devrait poser des questions sur someObject.whoAmI () .

Chaque fois que vous avez le besoin d'écrire si someObject.whoAmI () == 'ChildClass1' {do X (someObject)} , vous devez réellement ajouter un X () . méthode à la classe ParentClass avec diverses implémentations dans les différentes classes ChildClasses.

Ce type "d'identification de type au moment de l'exécution" peut presque toujours être remplacé par des conceptions de classe correctement polymorphes.

À partir de PHP 5.3, il sera possible d'utiliser le static mot clé , mais pour le moment cela n’est pas possible.

Non. Attendez PHP 5.3.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top