Comment le mécanisme de réflexion Reflection est-il implémenté en php ?

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

Cet article présente principalementExemple d'introductionLe mécanisme de réflexion Reflection de PHP. Cet article présente le mécanisme de réflexion Reflection de PHP du point de vue de l'utilisation de Reflection pour obtenir des informations sur une classe. Les amis dans le besoin peuvent s'y référer

.

PHP5 ajoute une nouvelle fonctionnalité : La réflexion. Cette fonctionnalité permet aux programmeurs de procéder à une ingénierie inverse de la classe, de l'interface, de la fonction, de la méthode et de l'extension. Grâce au code PHP, vous pouvez obtenir toutes les informations d'un objet et interagir avec lui.
Supposons qu'il existe une classe Person :

Le code est le suivant :

class Person {  
 /** 
     * For the sake of demonstration, we"re setting this private
     */ 
    private $_allowDynamicAttributes = false;
 
    /** type=primary_autoincrement */
    protected $id = 0;
 
    /** type=varchar length=255 null */
    protected $name;
 
    /** type=text null */
    protected $biography;
 
        public function getId()
        {
         return $this->id;
        }
        public function setId($v)
        {
            $this->id = $v;
        }
        public function getName()
        {
         return $this->name;
        }
        public function setName($v)
        {
          $this->name = $v;
        }
        public function getBiography()
        {
           return $this->biography;
        }
        public function setBiography($v)
        {
          $this->biography = $v;
        }
}
Copier après la connexion

Grâce à ReflectionClass, nous pouvons obtenir les informations suivantes de la classe Person :
1. Constantes
2.Noms de propriétés
3.Noms de méthodes
4.Propriétés statiques
5.Espace de nomsEspace de noms
6.Si la classe Person est finale ou résumé

Passez simplement le nom de la classe "Person" à ReflectionClass :

Le code est le suivant :

$class = new ReflectionClass('Person');
Copier après la connexion

Obtenez le attributs ( Propriétés ) :

Le code est le suivant :

$properties = $class->getProperties();
foreach
($properties as $property) {
    echo $property->getName()."\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography
Copier après la connexion

Par défaut, ReflectionClass obtiendra toutes les propriétés, y compris les propriétés privées et protégées. Si vous souhaitez uniquement obtenir l'attribut privé, vous devez passer un paramètre supplémentaire :

Le code est le suivant :

$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);
Copier après la connexion

Liste des paramètres disponibles :

Codez comme suit :

ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE
Copier après la connexion

Si vous souhaitez obtenir à la fois des propriétés publiques et privées, écrivez simplement comme ceci : ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED
Cela ne devrait pas me sentir étrange.

Le nom de la propriété peut être obtenu via $property->getName(), et le commentaire écrit dans la propriété peut être obtenu via getDocComment.

Le code est le suivant :

foreach($properties as $property) {
    if($property->isProtected()) {
        $docblock = $property->getDocComment();
        preg_match('/ type\=([a-z_]*) /', $property->getDocComment(), $matches);
        echo $matches[1]."\n";
    }
}
// Output:
// primary_autoincrement
// varchar
// text
Copier après la connexion

C'est un peu incroyable. Vous pouvez même obtenir des commentaires.
Get méthodes : obtenez toutes les méthodes de la classe via getMethods(). Ce qui est renvoyé est un tableau d’objets ReflectionMethod. Plus de manifestations.
Enfin, appelez la méthode dans la classe via ReflectionMethod.

Le code est le suivant :

$data = array("id" => 1, "name" => "Chris", "biography" => "I am am a PHP developer");
foreach($data as $key => $value) {
    if(!$class->hasProperty($key)) {
        throw new 
Exception
($key." is not a valid property");
    }
 
    if(!$class->hasMethod("get".
ucfirst
($key))) {
        throw new Exception($key." is missing a getter");
    }
 
    if(!$class->hasMethod("set".ucfirst($key))) {
        throw new Exception($key." is missing a setter");
    }
 
    // Make a new object to interact with
    $object = new Person();
 
    // Get the getter method and invoke it with the value in our data array
    $setter = $class->getMethod("set".ucfirst($key));
    $ok = $setter->invoke($object, $value);
 
    // Get the setter method and invoke it
    $setter = $class->getMethod("get".ucfirst($key));
    $objValue = $setter->invoke($object);
 
    // Now compare
    if($value == $objValue) {
        echo "Getter or Setter has modified the data.\n";
    } else {
        echo "Getter and Setter does not modify the data.\n";
   }
}
Copier après la connexion

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!