2010-03-02 6 views
0

Existe-t-il un moyen pour une classe appelée à l'intérieur d'une autre de connaître le nom de la classe externe?php obtenir le nom de la classe

Exemple:

class A{ 
    // need to get the name of B 
    // some stuff 
} 

class B{ 
    $var = new A; 
} 

get_parent_class() qon't faire le travail puisque B est pas un enfant de A.

Toutes les suggestions?

Modifier: Désolé tout le monde que j'ai dû changer la question. Ce que je voulais demander, c'est que la classe A puisse connaître le nom de la classe dans laquelle elle est appelée. Encore une fois désolé pour la première question idiote.

+3

Puisqu'il semble y avoir une certaine confusion sur ce que vous essayez de faire, veuillez affiner la question. – Gordon

Répondre

6

Non, c'est impossible.

Eh bien, presque. Vous pouvez pirater votre chemin à la classe appelante de debug_backtrace ou apd_callstack, mais c'est plutôt inefficace et lent. Xdebug a un certain nombre de fonctions qui pourraient vous aider à réaliser cela aussi, mais tout cela n'est rien que vous voulez dans le code de production.

Le moyen le plus simple serait de passer l'instance de B à A, par ex.

class A { 
    protected $callerInstance; 
    protected $callerClassName 
    public function __construct($caller) { 
     $this->callerInstance = $caller; 
     $this->callerClassName = get_class($caller); 
    } 
} 
+1

Je suis complètement d'accord avec vous. Ne pas comprendre pourquoi les gens votent en bas. –

+1

@Gordon vous avez raison, nous avons tous eu tort. +1 –

+0

+1 pour avoir lu la bonne question (et avoir la bonne réponse ofc) – Yacoby

2

Vous voulez get_class()

get_class - Retourne le nom de la classe d'un objet

modifier Comme gordon dit cela est impossible. Vous pourriez être en mesure d'analyser la pile des appels pour voir quelle classe s'appelle celle dans laquelle vous êtes, mais je ne le ferais pas.

1

Il est possible que si vous passez le nom de la classe B à la classe A constructeur. Cela nécessiterait une modification dans la classe A (et toutes les classes pour lesquelles vous en avez besoin). Hackish, mais fait ce dont vous avez besoin.

class A{ 
    function __construct($caller){ 
    echo $caller; // will echo B, C and D respectively 
    } 
} 

class B{ 
    $var = new A(get_class($this)); 
} 

class C{ 
    $var = new A(get_class($this)); 
} 

class D{ 
    $var = new A(get_class($this)); 
} 
Questions connexes