Maison >développement back-end >tutoriel php >Introspection et réflexion en php
Points de base
class_exists()
, get_class()
, get_parent_class()
et is_subclass_of()
. Ces fonctions fournissent des informations de base sur les classes, telles que leurs noms, les noms des classes parents, etc. ReflectionClass
Les classes sont les principales classes d'API qui sont utilisées pour appliquer des réflexions aux classes, aux interfaces et aux méthodes. L'introspection PHP est une caractéristique commune dans tout langage de programmation qui permet aux programmeurs de manipuler les classes d'objets. Vous trouverez une introspection particulièrement utile lorsque vous ne savez pas quelle classe ou méthode vous devez exécuter lors de la conception. L'introspection dans PHP fournit des fonctionnalités utiles pour vérifier les classes, les interfaces, les propriétés et les méthodes. PHP fournit un grand nombre de fonctions qui peuvent être utilisées pour accomplir cette tâche. Pour vous aider à comprendre l'introspection, j'utiliserai les exemples de PHP pour décrire brièvement certaines classes, méthodes et fonctions de PHP pour souligner comment elles sont utilisées. Dans cet article, vous verrez quelques exemples sur la façon d'utiliser certaines des fonctions d'introspection PHP les plus utiles, ainsi qu'une section dédiée à la fourniture d'une API (API réflexive) similaire à l'introspection.
Fonction d'introspection PHP
Dans le premier exemple, je démontrerai certaines fonctions d'introspection de PHP. Vous pouvez utiliser ces fonctions pour extraire des informations de base sur les classes, telles que leurs noms, les noms de la classe parent, etc.
class_exists()
- Vérifiez si la classe a été définie get_class()
- Renvoyez le nom de classe de l'objet get_parent_class()
- Renvoie le nom de classe de la classe parent de l'objet is_subclass_of()
- Vérifiez si l'objet a une classe parent donnée Ce qui suit est un exemple de code PHP contenant les définitions de classe Introspection
et Child
, ainsi que la sortie d'informations extraite par la fonction énumérée ci-dessus:
<code class="language-php"><?php class Introspection { public function description() { echo "I am a super class for the Child class.\n"; } } class Child extends Introspection { public function description() { echo "I'm " . get_class($this) , " class.\n"; echo "I'm " . get_parent_class($this) , "'s child.\n"; } } if (class_exists("Introspection")) { $introspection = new Introspection(); echo "The class name is: " . get_class($introspection) . "\n"; $introspection->description(); } if (class_exists("Child")) { $child = new Child(); $child->description(); if (is_subclass_of($child, "Introspection")) { echo "Yes, " . get_class($child) . " is a subclass of Introspection.\n"; } else { echo "No, " . get_class($child) . " is not a subclass of Introspection.\n"; } } ?></code>
La sortie du code ci-dessus doit être la suivante:
<code class="language-php"><?php class Introspection { public function description() { echo "I am a super class for the Child class.\n"; } } class Child extends Introspection { public function description() { echo "I'm " . get_class($this) , " class.\n"; echo "I'm " . get_parent_class($this) , "'s child.\n"; } } if (class_exists("Introspection")) { $introspection = new Introspection(); echo "The class name is: " . get_class($introspection) . "\n"; $introspection->description(); } if (class_exists("Child")) { $child = new Child(); $child->description(); if (is_subclass_of($child, "Introspection")) { echo "Yes, " . get_class($child) . " is a subclass of Introspection.\n"; } else { echo "No, " . get_class($child) . " is not a subclass of Introspection.\n"; } } ?></code>
Vous pouvez utiliser la méthode class_exists()
pour déterminer si la classe donnée a été définie, qui prend un paramètre de chaîne qui représente le nom de la classe requise à vérifier, et une valeur booléenne en option indiquant si l'autoader est appelé pendant la procédure. Les méthodes get_class()
et get_parent_class()
renvoient respectivement le nom de classe de l'objet ou le nom de classe de sa classe parent. Les deux prennent des instances d'objet sous forme de paramètres. La méthode is_subclass_of()
prend l'instance de l'objet comme premier paramètre et prend une chaîne représentant le nom de classe parent comme deuxième paramètre, et renvoie si l'objet appartient à une sous-classe de la classe donnée comme paramètre.
Ce qui suit est un deuxième exemple contenant les définitions de l'interface ICurrencyConverter
et de la classe GBPCurrencyConverter
, ainsi que la sortie d'information extraite par les fonctions énumérées ci-dessus. Comme pour le premier exemple, je vais d'abord énumérer les fonctions, puis vous montrer du code.
get_declared_classes()
- Revenez à une liste de toutes les classes déclarées get_class_methods()
- Renvoyez le nom de la méthode de classe get_class_vars()
- Renvoie l'attribut par défaut de la classe interface_exists()
- Vérifiez si l'interface est définie method_exists()
- Vérifiez si l'objet définit une méthode <code>The class name is: Introspection I am a super class for the Child class. I'm Child class. I'm Introspection's child. Yes, Child is a subclass of Introspection.</code>
La sortie du code ci-dessus doit être la suivante:
<code class="language-php"><?php interface ICurrencyConverter { public function convert($currency, $amount); } class GBPCurrencyConverter implements ICurrencyConverter { public $name = "GBPCurrencyConverter"; public $rates = array("USD" => 0.622846, "AUD" => 0.643478); protected $var1; private $var2; function __construct() {} function convert($currency, $amount) { return $this->rates[$currency] * $amount; } } if (interface_exists("ICurrencyConverter")) { echo "ICurrencyConverter interface exists.\n"; } $classes = get_declared_classes(); echo "The following classes are available:\n"; print_r($classes); if (in_array("GBPCurrencyConverter", $classes)) { print "GBPCurrencyConverter is declared.\n"; $gbpConverter = new GBPCurrencyConverter(); $methods = get_class_methods($gbpConverter); echo "The following methods are available:\n"; print_r($methods); $vars = get_class_vars("GBPCurrencyConverter"); echo "The following properties are available:\n"; print_r($vars); echo "The method convert() exists for GBPCurrencyConverter: "; var_dump(method_exists($gbpConverter, "convert")); } ?></code>
Comme vous l'avez peut-être deviné, la méthode interface_exists()
est très similaire à la méthode class_exists()
discutée dans le premier exemple. Il détermine si l'interface donnée a été définie et prend un paramètre de chaîne du nom de l'interface et un booléen automatique en option. La méthode get_declared_classes()
renvoie un tableau contenant les noms de toutes les classes définies sans aucun argument. Selon la bibliothèque que vous avez chargée (compiler en php ou chargé à l'aide de require
/ include
), d'autres classes peuvent exister. get_class_method()
prend une instance d'objet ou une chaîne représentant la classe requise en tant que paramètre et renvoie un tableau de noms de méthode définis par la classe. Notez que de toutes les propriétés définies dans la classe ICurrencyConverter
et toutes les propriétés renvoyées par la méthode get_class_vars()
, seule $name
et $rates
apparaissent dans la sortie. Les propriétés privées et protégées sont ignorées.
API de réflexion PHP
PHP prend en charge la réflexion via son API de réflexion. Comme vous pouvez le voir dans le manuel PHP, l'API de réflexion est beaucoup plus généreuse que le mécanisme d'introspection et fournit un grand nombre de classes et de méthodes que vous pouvez utiliser pour effectuer des tâches de réflexion. Les classes ReflectionClass
sont la classe principale de l'API, utilisée pour appliquer les réflexions aux classes, aux interfaces et aux méthodes, et à extraire des informations sur toutes les composantes de la classe. La réflexion est facile à implémenter dans votre code d'application et est aussi intuitive que l'introspection. Voici un exemple qui illustre la réflexion à l'aide de l'interface ICurrencyConverter
et des classes Child
et GBPCurrencyConverter
:
<code class="language-php"><?php class Introspection { public function description() { echo "I am a super class for the Child class.\n"; } } class Child extends Introspection { public function description() { echo "I'm " . get_class($this) , " class.\n"; echo "I'm " . get_parent_class($this) , "'s child.\n"; } } if (class_exists("Introspection")) { $introspection = new Introspection(); echo "The class name is: " . get_class($introspection) . "\n"; $introspection->description(); } if (class_exists("Child")) { $child = new Child(); $child->description(); if (is_subclass_of($child, "Introspection")) { echo "Yes, " . get_class($child) . " is a subclass of Introspection.\n"; } else { echo "No, " . get_class($child) . " is not a subclass of Introspection.\n"; } } ?></code>
La sortie du code ci-dessus doit être la suivante:
<code>The class name is: Introspection I am a super class for the Child class. I'm Child class. I'm Introspection's child. Yes, Child is a subclass of Introspection.</code>La méthode
getInterfaceNames()
renvoie un tableau contenant les noms d'interface de l'implémentation de classe. La méthode getParentClass()
peut renvoyer la représentation d'objet ReflectionClass
de la classe parent, et false si la classe parent n'existe pas. Pour répertorier les noms des objets ReflectionClass
, vous pouvez utiliser la méthode getName()
, comme indiqué dans le code ci-dessus. La méthode getMethods()
récupère le tableau de méthode et peut combiner les massass Bitrasks pour ReflectionMethod::IS_STATIC
, IS_PUBLIC
, IS_PROTECTED
, IS_PRIVATE
, IS_ABSTRACT
, IS_FINAL
,
comme paramètres facultatifs pour filtrer la liste en fonction de la visibilité. L'API de réflexion fournit une bonne mise en œuvre de la réflexion, vous permettant de créer des applications plus complexes telles que l'apigène, mais une discussion plus approfondie va au-delà de l'objectif de cet article.
Résumé
Dans cet article, vous avez appris à utiliser les fonctions introspectives de PHP et les API de réflexion pour obtenir des informations sur les classes, les interfaces, les propriétés et les méthodes. Le but d'extraire ces informations est de mieux comprendre votre code à l'exécution et de créer des applications complexes.
(image de Fotolia)(FAQ sur l'introspection et la réflexion dans PHP) La section FAQ est omise ici car elle est trop longue et ne correspond pas à l'objectif pseudo-original. Si nécessaire, vous pouvez poser une question FAQ séparément.
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!