Qu'est-ce que la réflexion en PHP ? Explication détaillée des exemples d'utilisation de la réflexion

伊谢尔伦
Libérer: 2023-03-12 09:12:01
original
1150 Les gens l'ont consulté

Orienté objetLes objets en édition ont la capacité d'introspecter, et ce processus d'introspection est la réflexion

La réflexion, la compréhension intuitive doit découvrir le point de départ et la source en fonction du. lieu d'arrivée. Par exemple, si je vous donne un objet nu, je peux connaître la classe à laquelle il appartient et de quelles méthodes il dispose grâce à cet objet.

La réflexion fait référence à l'extension de l'analyse du programme PHP dans le État d'exécution de PHP et exportation Ou extraire des informations détaillées sur les classes, les méthodes, les attributs, les paramètres, etc., y compris les annotations Cette fonction d'obtention dynamique d'informations et d'appel dynamique de méthodes d'objet est appelée API de réflexion

Comment utiliser l'API Reflection

Prenons le code suivant comme exemple

class HandsonBoy
{
    public $name = 'chenqionghe';
    public $age = 18;
    public function set($name,$value)
    {
        echo &#39;您正在设置私有属性&#39;.$name.&#39;<br >值为&#39;.$value.&#39;<br>&#39;;
        $this->$name = $value;
    }
    public function get($name)
    {
        if(!isset($this->$name))
        {
            echo &#39;未设置&#39;.$name;
            $this->$name = "正在为你设置默认值".&#39;<br>&#39;;
        }
        return $this->$name;
    }
}
$boy = new HandsonBoy();
echo $boy->name.&#39;<br />&#39;;
$boy->hair = &#39;short&#39;;
Copier après la connexion
Maintenant, que devons-nous faire pour obtenir la méthode et la liste d'attributs de cet étudiant objet ? Cela peut être réalisé en utilisant la réflexion, le code est le suivant

$reflect = new ReflectionObject($boy);
$props = $reflect->getProperties();
//获取属性的名字
foreach($props as $prop)
{
    print $prop->getName().PHP_EOL;
}
//获取对象方法列表
$methos = $reflect->getMethods();
foreach($methos as $method)
{
    print $method->getName().PHP_EOL;
}
Copier après la connexion
Vous pouvez également utiliser la fonction de classe au lieu de l'API de réflexion pour renvoyer un tableau associatif de propriétés d'objet et plus d'informations : (pour le public propriétés et) :

//返回对象属性的关联数组
var_dump(get_object_vars($boy));
//类属性
var_dump(get_class_vars(get_class($boy)));
//返回由类的属性的方法名组成的数组
var_dump(get_class_methods(get_class($boy)));
Copier après la connexion
Réflexion La fonction de l'API est évidemment plus puissante, et elle peut même restaurer le prototype de cette classe, y compris les droits d'accès de la méthode. Ce qui suit encapsule simplement le code de. une classe d'impression

/**
 * @param $classObject 对象或者类名
 */
function getClass($classObject)
{
    $object = new ReflectionClass($classObject);
    $className = $object->getName();
    $Methods = $Properties = array();
    foreach($object->getProperties() as $v)
    {
        $Properties[$v->getName()] = $v;
    }
    foreach($object->getMethods() as $v)
    {
        $Methods[$v->getName()] = $v;
    }
    echo "class {$className}\n{\n";
    is_array($Properties) && ksort($Properties);
    foreach($Properties as $k=>$v)
    {
        echo "\t";
        echo $v->isPublic() ? &#39;public&#39; : &#39;&#39;,$v->isPrivate() ? &#39;private&#39; :&#39;&#39;,$v->isProtected() ? &#39;protected&#39; : &#39;&#39;;
        $v->isStatic() ? &#39;static&#39; : &#39;&#39;;
        echo "\t{$k}\n";
    }
    echo "\n";
    if(is_array($Methods)) ksort($Methods);
    foreach($Methods as $k=>$v)
    {
        echo "\tfunction {$k}()\n";
    }
    echo "}\n";
}
Copier après la connexion
De plus,

Manuel PHP Il contient des dizaines d'API de réflexion. On peut dire que la réflexion décrit complètement le prototype d'une classe ou d'un objet. peut être utilisé non seulement pour les classes et les objets, mais aussi pour les fonctions, les modules d'extension, les exceptions, etc.

Quel est le rôle de la réflexion

La réflexion peut être utilisée pour la génération de documents, il peut donc être utilisé pour analyser les classes du fichier et générer des documents de description un par un.

Puisque Reflection peut détecter la structure interne d'une classe, il peut également être utilisé comme un crochet pour implémenter des fonctions de plug-in ? Ou en tant que proxy dynamique ? Pour illustrer, le code suivant est un exemple simple

<?php
class mysql
{
    function connect($db)
    {
        echo "连接到数据库{$db[0]}".PHP_EOL;
    }
}
class sqlproxy
{
    private $target;
    public function construct($tar)
    {
        $this->target[] = new $tar;
    }
    public function call($name,$args)
    {
        foreach($this->target as $obj)
        {
            $r = new ReflectionClass($obj);
            if($method = $r->getMethod($name))
            {
                if($method->isPublic() && !$method->isAbstract())
                {
                    echo "方法前拦截记录LOG".PHP_EOL;
                    $method->invoke($obj,$args);
                    echo "方法后拦截".PHP_EOL;
                }
            }
        }
    }
}
$obj = new sqlproxy(&#39;mysql&#39;);
$obj->connect(&#39;chenqionghe&#39;);
Copier après la connexion
La vraie classe opérationnelle ici est la classe mysql, mais sqlproxy implémente l'exécution de la classe réelle basée sur Paramètres passés dynamiquement, intercepte avant et après l'exécution de la méthode et modifie dynamiquement les méthodes et les attributs dans la classe. Il s'agit d'un simple proxy dynamique

Il n'y a pas beaucoup d'endroits où la réflexion est utilisée dans le développement normal : l'un consiste à déboguer des objets

et l'autre à obtenir des informations de classe. Dans le développement MVC et de plug-ins, l'utilisation de la réflexion est très courante, mais la réflexion Cela consomme beaucoup d'argent, alors n'en abusez pas si. vous pouvez trouver une alternative. PHP a la fonction Token, qui peut implémenter certaines fonctions de réflexion via ce mécanisme, d'un point de vue simple et flexible, il est souhaitable d'utiliser la réflexion fournie par l'API. 🎜> Plusieurs fois, une bonne utilisation de la réflexion peut garder le code élégant et concis, mais la réflexion peut également détruire l'encapsulation de la classe, car la réflexion peut forcer l'exposition de méthodes ou de propriétés qui ne devraient pas être exposées. Sortez, c'est les deux. un avantage et un inconvénient.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal