1. Qu'est-ce que la réflexion ?
Il s'agit d'étendre l'analyse des programmes PHP dans l'état d'exécution de PHP, d'exporter ou d'extraire des informations détaillées sur les classes, les méthodes, les propriétés, les paramètres, etc., y compris Commentez . Cette fonction d'obtention dynamique d'informations et d'appel dynamique de méthodes d'objets est appelée API de réflexion.
Reflection est une API permettant de manipuler des méta-modèles dans le paradigme Orienté objet . Elle est très puissante et peut nous aider à créer des applications complexes et évolutives.
Ses utilisations incluent : Le chargement automatique des plug-ins, la génération automatique de documents, et peut même être utilisé pour étendre le langage PHP.
La fonction de réflexion est très puissante, alors comment l'utiliser spécifiquement ? Quels sont les scénarios d’application ? Prenez la classe CI_Upload du framework CI pour illustrer. (Après une recherche globale de ReflectionClass, je n'ai trouvé que cet endroit où la réflexion est utile.)
La logique de base de cette méthode est que l'appelant transmet un tableau $config lors de l'instanciation de CI_Upload, ainsi que toutes les configurations du tableau. sont stockés dans la méthode. Attribuez la valeur à l'attribut membre de la classe correspondant (si l'attribut a une méthode set_* correspondante, appelez la méthode set_*)
public function initialize(array $config = array(), $reset = TRUE){ $reflection = new ReflectionClass($this); ... #遍历config,如果存在set_方法调用set方法,没有则直接赋值 foreach ($config as $key => $v) { if (method_exists($this, 'set_' . $key)) { $this->{'set_' . $key}($v); }else{ $this->$key =$v; } } ...
Cette méthode présente un inconvénient : Il est impossible de déterminer si toutes les clés du tableau de configuration sont légales et si elles sont des attributs membres de la classe
Cependant, la réflexion peut être utilisée à déterminer.
L'avantage de la réflexion ici est qu'elle peut déterminer si une classe a des attributs (hasProperty
) et si une classe a des méthodes (hasMethod
).
D:\project\app\system\libraries\Upload.php/** * Initialize preferences * * @param array $config * @param bool $reset * @return CI_Upload */public function initialize(array $config = array(), $reset = TRUE){ $reflection = new ReflectionClass($this); ... foreach ($config as $key => &$value) { if ($key[0] !== '_' && $reflection->hasProperty($key)) { if ($reflection->hasMethod('set_'.$key)) { $this->{'set_'.$key}($value); } else { $this->$key = $value; } } } ...
À propos de la réflexion (qu'il s'agisse d'une classe de réflexion (ReflectionClass) ou d'une fonction de réflexion ReflectionFunction, c'est en fait une classe et des fonctions), rappelez-vous juste une chose : les classes/fonctions de réflexion peuvent obtenir toutes les informations sur la classe, y compris :
- les informations de base de la classe (nom de la classe, s'il s'agit d'une classe abstraite, si elle peut être instanciée, si la classe est finale ou abstraite)
- Méthodes de classe, si la méthode existe, valeur de retour de la méthode, annotation de la méthode, noms des méthodes
- Attributs de classe, attributs statiques, constantes
- Localisation naming Space Namespace
Pour ceux qui ont la situation ci-dessus, autant utiliser la réflexion pour la résoudre :)
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!