2017-09-01 3 views
2

j'ai une classe abstraite et une classe étendue:PHP: dynamiquement obtenir le nom d'une classe qui étend la classe actuelle

abstract class MyAbstract { 
    public function getName(){echo static::class;} 
} 

class MyExtends extends MyAbstract {} 

Je voudrais obtenir dynamiquement le nom d'une classe étendue lorsque getName() est appelé:

$c = new MyExtends(); 
echo $c->getName(); // expect: "MyExtends" 

Cela fonctionne bien sur PHP 5.6+ (demo), mais le projet sur lequel je travaille est limitée à PHP 5.3 et je ne l'effet de levier pour changer cela. Sur cette version, une erreur d'analyse syntaxique est jeté:

Parse error: syntax error, unexpected T_CLASS, expecting T_STRING or T_VARIABLE or '$'

Je modifié la fonction:

public function getName(){echo __CLASS__;} 

Bien sûr, cela fait écho juste le nom du parent - MyAbstract, il ne fonctionne pas . La seule chose à laquelle j'ai pensé est de surcharger getName() avec une nouvelle implémentation dans chaque classe d'extension, mais cela ne va pas bien: tout le point de l'héritage est de concentrer la base de code commune dans un parent (et bien sûr la vraie fonction n'est pas un one-liner).

Toute idée comment je peux obtenir dynamiquement le nom de classe s'étendant du contexte de la classe mère abstraite en PHP 5.3?

Répondre

2

Vous pouvez utiliser get_class pour obtenir le nom de la classe:

<?php 
abstract class MyAbstract 
{ 
    public function getName() 
    { 
     echo get_class($this); 
    } 
} 

class MyExtends extends MyAbstract 
{ 
} 

$c = new MyExtends(); 
echo $c->getName(); // expect: "MyExtends" 

demo:https://ideone.com/TtMtZ7

Le code ci-dessus devrait fonctionner sur toutes les versions (depuis 5.0.4).

+1

Merci. oui cela fonctionne comme prévu. S'il vous plaît ajouter un lien vers les docs pour améliorer la réponse: http://php.net/manual/fr/function.get-class.php – BeetleJuice

+0

@BeetleJuice - lien était disponible mais en allemand: P - changé en anglais. THX. –

+0

Cool site (ideone.com); Je ne savais pas à ce sujet. – BeetleJuice

2

Peut-être:

public function getName(){get_class($this);} 

ai pas testé cependant.

+1

Votre instinct est correct. Il fonctionne – BeetleJuice

+0

excellent. Bonne chance – ASOlivieri