La réflexion consiste à étendre l'analyse des programmes PHP dans l'état d'exécution de PHP, et à exporter ou extraire des informations détaillées sur les classes, méthodes, propriétés, paramètres, etc., y compris les commentaires. 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 : Chargement automatique de plug-ins, génération automatique de documents et peut même être utilisé pour étendre le langage PHP.
L'API PHP Reflection se compose de plusieurs classes qui nous aident à accéder aux métadonnées du programme ou à interagir avec les annotations associées. Avec l'aide de la réflexion, nous pouvons obtenir les méthodes implémentées par la classe, créer une instance de la classe (différente de la création avec new), appeler une méthode (également différente de l'appel régulier), transmettre des paramètres et appeler dynamiquement le static méthodes de la classe.
L'API Reflection est l'extension de la technologie oop intégrée de PHP, comprenant certaines classes, exceptions et interfaces utilisées ensemble, elles peuvent être utilisées pour nous aider à analyser d'autres classes, interfaces, méthodes, propriétés, méthodes et extensions. Ces extensions oop sont appelées réflexion.
Grâce à ReflectionClass, nous pouvons obtenir les informations suivantes de la classe Person :
1) Contenu de la constante
2) Noms des propriétés
3) Noms des méthodes statiques
4) Propriétés statiques
5) Espace de noms Espace de noms
6) Que la classe Person soit finale ou abstraite
Ensuite je suis allé regarder le code source de thinkphp , j'ai également différentes expériences avec l'implémentation de MVC La méthode exec dans ThinkPHPLibCoreApp.class.php
if(!preg_match('/^[A-Za-z](\w)*$/',$action)){ // 非法操作 throw new ReflectionException(); } //执行当前操作 $method = new ReflectionMethod($module, $action); #查看方法 if($method->isPublic()) { $class = new ReflectionClass($module); #反射控制器 // 前置操作 if($class->hasMethod('_before_'.$action)) { $before = $class->getMethod('_before_'.$action); if($before->isPublic()) { $before->invoke($module); } } // URL参数绑定检测 if(C('URL_PARAMS_BIND') && $method->getNumberOfParameters()>0){ switch($_SERVER['REQUEST_METHOD']) { case 'POST': $vars = $_POST; break; case 'PUT': parse_str(file_get_contents('php://input'), $vars); break; default: $vars = $_GET; } $params = $method->getParameters(); foreach ($params as $param){ $name = $param->getName(); if(isset($vars[$name])) { $args[] = $vars[$name]; }elseif($param->isDefaultValueAvailable()){ $args[] = $param->getDefaultValue(); }else{ throw_exception(L('_PARAM_ERROR_').':'.$name); } } $method->invokeArgs($module,$args); }else{ $method->invoke($module); #执行我们需要调用函数 } // 后置操作 if($class->hasMethod('_after_'.$action)) { $after = $class->getMethod('_after_'.$action); if($after->isPublic()) { $after->invoke($module); } }
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!