Maison  >  Article  >  développement back-end  >  Explication détaillée et exemple de code de réflexion en php

Explication détaillée et exemple de code de réflexion en php

高洛峰
高洛峰original
2016-12-23 12:57:241319parcourir

Récemment, je lisais des idées de programmation Java et j'ai vu le chapitre sur les informations de type, qui parlait des informations de classe et du concept de réflexion. Au fait, passons en revue les outils de réflexion de php. Le manuel dit ceci : « PHP 5 dispose d'une API de réflexion complète, ajoutant la possibilité de procéder à une ingénierie inverse des classes, des interfaces, des fonctions, des méthodes et des extensions. De plus, l'API de réflexion fournit des méthodes pour supprimer des fonctions, des classes et des méthodes. Commentaire de la documentation. "Bien sûr, le manuel est un peu abstrait ! Ce qu'on appelle l'ingénierie inverse signifie que vous pouvez obtenir des informations détaillées sur les classes, les méthodes, les attributs, les paramètres, etc., y compris les commentaires. Le texte est toujours aussi ennuyeux. Par exemple,

class Foo {
  public  $foo = 1;
  protected $bar = 2;
  private  $baz = 3;
   
  /**
   * Enter description here ...
   */
  public function myMethod()
  {
    echo 'hello 2b';
  }
}
 
$ref = new ReflectionClass('Foo');
$props = $ref->getProperties();
foreach ($props as $value) {
  echo $value->getName()."\n";
}
 
//output
//foo 
//bar
//baz

ReflectionClass renvoie le. valeur d'une certaine classe. Informations associées, telles que les propriétés, les méthodes, les espaces de noms, les interfaces implémentées, etc.! Dans l’exemple précédent, ReflectionClass::getProperties a renvoyé un tableau d’objets ReflectionProperty.

La classe ReflectionProperty rapporte des informations sur les propriétés d'une classe. Par exemple, isDefault isPrivate isProtected isPublic isStatic, etc., la méthode getName consiste à obtenir le nom de l'attribut !

Les éléments ci-dessus servent à obtenir des attributs, et il existe également des méthodes pour obtenir des méthodes de classe, telles que

class Foo {
  public  $foo = 1;
  protected $bar = 2;
  private  $baz = 3;
   
  /**
   * Enter description here ...
   */
  public function myMethod()
  {
    echo 'hello 2b';
  }
}
 
$ref = new ReflectionClass('Foo');
$method = $ref->getMethod('myMethod');
$method->invoke($ref->newInstance());

ReflectionClass::getMethod est un type ReflectionMethod. La classe ReflectionMethod rapporte des informations sur un. méthode, telle que isAbstract isPrivate isProtected isPublic isStatic isConstructor, il existe également une méthode importante Invoke, InvokeArgs est la méthode d'exécution !

Pour les autres objets, vous pouvez lire le manuel, ce n'est pas difficile !

A quoi sert la réflexion ?

La réflexion est un concept exécuté de manière dynamique, utilisés ensemble, ils peuvent être utilisés pour nous aider à analyser d'autres classes, interfaces, méthodes, propriétés, méthodes et extensions. Des modèles peuvent également être créés, tels que des proxys dynamiques. Il est également très courant d'utiliser la réflexion dans certains frameworks PHP, tels que kohana et yii. Voici le code de kohana pour implémenter mvc, qui utilise la réflexion !

// Start validation of the controller
$class = new ReflectionClass(ucfirst(Router::$controller).'_Controller');
// Create a new controller instance
$controller = $class->newInstance();
// Load the controller method
$method = $class->getMethod(Router::$method);
// Execute the controller method
$method->invokeArgs($controller, $arguments);

Le code ci-dessus permet de voir clairement le processus de ce framework ! Grâce au routeur, vous traitez réellement la classe url. Grâce au routeur, vous pouvez obtenir quel contrôleur et quelle méthode ! Ensuite, exécutez à nouveau la méthode !

Ce qui précède est la collecte d'informations sur la réflexion PHP. Nous continuerons à ajouter des informations pertinentes à l'avenir. Merci pour votre soutien à ce site !

Pour des explications plus détaillées sur la réflexion PHP et des exemples d'articles liés au code, veuillez prêter attention au site Web PHP 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