Reflection besteht darin, die Analyse von PHP-Programmen im laufenden Zustand von PHP zu erweitern und detaillierte Informationen zu Klassen, Methoden, Eigenschaften, Parametern usw., einschließlich Kommentaren, zu exportieren oder zu extrahieren. Diese Funktion zum dynamischen Abrufen von Informationen und zum dynamischen Aufrufen von Methoden von Objekten wird als Reflexions-API bezeichnet. Reflection ist eine API zur Bearbeitung von Metamodellen im objektorientierten -Paradigma. Sie ist sehr leistungsfähig und kann uns beim Erstellen komplexer und skalierbarer Anwendungen helfen.
Zu seinen Verwendungsmöglichkeiten gehören: Automatisches Laden von Plug-Ins, automatische Generierung von Dokumenten und kann sogar zur Erweiterung der PHP-Sprache verwendet werden.
Die PHP Reflection API besteht aus mehreren Klassen, die uns helfen, auf die Metadaten des Programms zuzugreifen oder mit zugehörigen Anmerkungen zu interagieren. Mit Hilfe der Reflexion können wir die von der Klasse implementierten Methoden abrufen, eine Instanz der Klasse erstellen (anders als beim Erstellen mit new), eine Methode aufrufen (ebenfalls anders als den regulären Aufruf), Parameter übergeben und die Statik dynamisch aufrufen Methoden der Klasse.
Reflection API ist die in PHP integrierte OOP-Technologieerweiterung, einschließlich einiger Klassen, Ausnahmen und Schnittstellen. Zusammen können sie verwendet werden, um uns bei der Analyse anderer Klassen, Schnittstellen, Methoden, Eigenschaften, Methoden und Erweiterungen zu helfen. Diese Oop-Erweiterungen werden als Reflection bezeichnet.
Über ReflectionClass können wir die folgenden Informationen der Person-Klasse abrufen:
1) Konstante Inhalte
2) Eigenschaftsnamen
3) Methodennamen statisch
4) Statische Eigenschaften
5) Namespace Namespace
6) Ob die Person-Klasse endgültig oder abstrakt ist
Dann habe ich mir den Quellcode von angesehen thinkphp, ich habe auch unterschiedliche Erfahrungen mit der Implementierung von MVC in 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); } }
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Definition und Verwendung von Reflection in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!