Maison >développement back-end >tutoriel php >Introspection et réflexion en php

Introspection et réflexion en php

Jennifer Aniston
Jennifer Anistonoriginal
2025-02-27 08:35:13120parcourir

Introspection and Reflection in PHP

Points de base

  • Le mécanisme d'introspection de PHP permet aux programmeurs de manipuler les classes d'objets et de vérifier les classes, les interfaces, les propriétés et les méthodes. Ceci est particulièrement utile lorsque la classe ou la méthode à exécuter au moment de la conception est inconnue.
  • PHP fournit diverses fonctions d'introspection telles que 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.
  • L'API de réflexion de PHP fournit des fonctionnalités de type introspection et est plus riche en fournissant le nombre de classes et de méthodes utilisées pour effectuer des tâches de réflexion. 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 et la réflexion dans PHP sont des outils puissants qui permettent aux développeurs de mieux comprendre leur code lors de l'exécution, de créer des applications complexes et de modifier le comportement d'exécution des objets. Cependant, ils doivent être utilisés avec prudence, car ils peuvent rendre le code plus complexe et plus difficile à comprendre.

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,

, et

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn