1. Was ist Reflexion?
Es bezieht sich auf die Erweiterung der Analyse von PHP-Programmen im laufenden Zustand von PHP, das Exportieren oder Extrahieren detaillierter Informationen zu Klassen, Methoden, Eigenschaften, Parametern usw., einschließlich Kommentieren . 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 Manipulation von Metamodellen im objektorientierten -Paradigma. Sie ist sehr leistungsfähig und kann uns beim Erstellen komplexer und skalierbarer Anwendungen helfen.
Zu den Verwendungsmöglichkeiten gehören: Automatisches Laden von Plug-ins, automatische Generierung von Dokumenten und kann sogar zur Erweiterung der PHP-Sprache verwendet werden.
Die Reflexionsfunktion ist sehr leistungsfähig, wie kann man sie also konkret verwenden? Welche Anwendungsszenarien gibt es? Nehmen Sie zur Veranschaulichung die CI_Upload-Klasse des CI-Frameworks. (Nach einer globalen Suche nach ReflectionClass habe ich nur diesen Ort gefunden, an dem Reflektion nützlich ist.)
Die Kernlogik dieser Methode besteht darin, dass der Aufrufer beim Instanziieren von CI_Upload ein $config-Array und alle Konfigurationen im Array übergibt werden in der Methode gespeichert. Weisen Sie den Wert dem entsprechenden Klassenmitgliedsattribut zu (wenn das Attribut eine entsprechende set_*-Methode hat, rufen Sie die set_*-Methode auf)
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; } } ...
Diese Methode hat einen Nachteil: Es ist unmöglich zu bestimmen, ob alle Schlüssel im Konfigurationsarray zulässig sind und ob sie Mitgliedsattribute der Klasse sind
Allerdings kann Reflektion verwendet werden zu bestimmen.
Der Vorteil der Reflexion besteht hier darin, dass sie bestimmen kann, ob eine Klasse Attribute (hasProperty
) und ob eine Klasse Methoden (hasMethod
) hat.
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; } } } ...
Über Reflexion (ob es sich um eine Reflexionsklasse (ReflectionClass) oder eine Reflexionsfunktion ReflectionFunction handelt, es ist eigentlich eine Klasse und Funktionen) Denken Sie nur an eines: Reflexionsklassen/-funktionen können alle Informationen über die Klasse erhalten, einschließlich:
- grundlegende Informationen der Klasse (Klassenname, ob es sich um eine abstrakte Klasse, ob es instanziiert werden kann, ob die Klasse final oder abstrakt ist) - Klassenmethoden, ob die Methode existiert, Methodenrückgabewert, Methodenanmerkung, Methodennamen
- Klassenattribute, statische Attribute, Konstanten
- Standort
Benennungsraum Namensraum
Das obige ist der detaillierte Inhalt vonErweiterte PHP-Funktionen – detaillierte Reflexionsbeispiele. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!