Maison  >  Article  >  développement back-end  >  Exemples de réflexion détaillés sur les fonctionnalités avancées de PHP

Exemples de réflexion détaillés sur les fonctionnalités avancées de PHP

伊谢尔伦
伊谢尔伦original
2017-07-01 10:47:401324parcourir

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.

2. Les utilisations de la réflexion

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.

3. Exemples d'application spécifiques de la réflexion - prendre un exemple d'implémentation du framework CI

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_*)

Méthode 1. Méthode d'écriture sans réflexion :

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).

Méthode 2. Implémentation dans le cadre CI

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;
            }
        }
    }
...

Quatre résumé

À 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!

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