Comment récupérer le nom de classe à partir d'appels statiques dans des classes PHP étendues
En génie logiciel, l'héritage permet aux classes d'hériter des propriétés et des fonctionnalités de leurs classes de parents. En PHP, lorsque vous étendez une classe avec des sous-classes, vous pouvez accéder aux propriétés et méthodes définies dans la classe parent. Cependant, accéder au nom de la sous-classe à partir d'une méthode statique dans la classe parent peut être difficile.
Problème :
Supposons que vous ayez une classe parent Action et un sous-classe MyAction qui hérite d'Action. Vous souhaitez développer une méthode dans la classe Action qui renvoie le nom de la sous-classe lorsqu'elle est appelée statiquement depuis la sous-classe. Cependant, l'utilisation de la variable __CLASS__ dans la classe parent renvoie toujours le nom de la classe parent, ce qui n'est pas le résultat souhaité.
Solution 1 : liaisons statiques tardives (PHP 5.3) :
PHP 5.3 a introduit des liaisons statiques tardives, qui résolvent la classe cible pour les appels de méthodes statiques au moment de l'exécution plutôt que pendant la définition. Cette fonctionnalité permet d'utiliser la fonction get_call_class(), qui récupère le nom de la classe à partir de laquelle une méthode statique est invoquée.
Par exemple :
<code class="php">class Action { public static function n() { return get_called_class(); } } class MyAction extends Action { } echo MyAction::n(); //displays MyAction</code>
Dans cet exemple, le La fonction get_call_class() renvoie le nom de la sous-classe MyAction, même si la méthode est définie dans la classe parent Action. Cette approche fournit une solution simple au problème.
Solution 2 : Récupération dynamique du nom de classe (PHP 5.2) :
Bien que les liaisons statiques tardives ne soient pas disponibles dans les versions PHP avant la version 5.3, il existe une méthode alternative pour récupérer dynamiquement le nom de la classe :
<code class="php">class Action { public function n() { $object = new ReflectionObject($this); return $object->getName(); } } class MyAction extends Action { } $myAction = new MyAction(); echo $myAction->n(); //displays MyAction</code>
Dans cette approche, nous créons une instance ReflectionObject pour l'objet actuel et utilisons la méthode getName() pour récupérer le nom de la classe . Cette solution fonctionne dans les versions PHP remontant à 5.2 mais nécessite une étape supplémentaire de création d'un objet de réflexion.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!