Reflexion
Bei der objektorientierten Programmierung erhalten Objekte die Fähigkeit zur Selbstbeobachtung, und dieser Selbstbeobachtungsprozess ist Reflexion.
Nachdenken und intuitives Verstehen besteht darin, den Ausgangspunkt und die Quelle anhand des Ankunftsorts zu finden. Beispielsweise können wir bei einem bloßen Objekt allein durch dieses Objekt erkennen, zu welcher Klasse es gehört und welche Methoden es hat.
Reflexion bezieht sich auf die Erweiterung der Analyse von PHP-Programmen im laufenden Zustand von PHP, das Exportieren oder Vorschlagen detaillierter Informationen zu Klassen, Methoden, Eigenschaften, Parametern usw., einschließlich Kommentaren. Diese Funktion zum dynamischen Abrufen von Informationen und zum dynamischen Aufrufen von Objektmethoden wird als Reflexions-API bezeichnet.
Wie verwende ich die Reflection API?
<?php class person{ public $name; public $gender; public function say(){ echo $this->name," \tis ",$this->gender,"\r\n"; } public function set($name, $value) { echo "Setting $name to $value \r\n"; $this->$name= $value; } public function get($name) { if(!isset($this->$name)){ echo '未设置'; $this->$name="正在为你设置默认值"; } return $this->$name; } } $student=new person(); $student->name='Tom'; $student->gender='male'; $student->age=24;
Was sollen wir nun tun, um die Methoden- und Eigenschaftenliste dieses Studentenobjekts zu erhalten? Wie im folgenden Code gezeigt:
// 获取对象属性列表 $reflect = new ReflectionObject($student); $props = $reflect->getProperties(); foreach ($props as $prop) { print $prop->getName() ."\n"; } // 获取对象方法列表 $m=$reflect->getMethods(); foreach ($m as $prop) { print $prop->getName() ."\n"; }
Sie können auch die Klassenfunktion ohne Reflektion-API verwenden, um ein assoziatives Array von Objekteigenschaften und weitere Informationen zurückzugeben:
// 返回对象属性的关联数组 var_dump(get_object_vars($student)); // 类属性 var_dump(get_class_vars(get_class($student))); // 返回由类的方法名组成的数组 var_dump(get_class_methods(get_class($student)));
Wenn dieses Objekt von other übergeben wird Seiten Wenn Sie hierher kommen, woher wissen Sie, zu welcher Kategorie es gehört? Sie können dies mit nur einer Codezeile erledigen:
// 获取对象属性列表所属的类 echo get_class($student);
Die Funktion der Reflection-API ist offensichtlich leistungsfähiger und kann sogar den Prototyp dieser Klasse wiederherstellen, einschließlich der Zugriffsberechtigungen von Methoden usw. Zum Beispiel:
// 反射获取类的原型 $obj = new ReflectionClass('person'); $className = $obj->getName(); $Methods = $Properties = array(); foreach($obj->getProperties() as $v) { $Properties[$v->getName()] = $v; } foreach($obj->getMethods() as $v) { $Methods[$v->getName()] = $v; } echo "class {$className}\n{\n"; is_array($Properties)&&ksort($Properties); foreach($Properties as $k => $v) { echo "\t"; echo $v->isPublic() ? ' public' : '',$v->isPrivate() ? ' private' : '', $v->isProtected() ? ' protected' : '', $v->isStatic() ? ' static' : ''; echo "\t{$k}\n"; } echo "\n"; if(is_array($Methods)) ksort($Methods); foreach($Methods as $k => $v) { echo "\tfunction {$k}(){}\n"; } echo "}\n";
Die Ausgabe lautet wie folgt:
class person { public gender public name function get(){} function set(){} function say(){} }
Darüber hinaus gibt es Dutzende von Reflection-APIs im PHP-Handbuch. Man kann sagen, dass Reflection das vollständig beschreibt Prototyp einer Klasse oder eines Objekts. Reflection kann nicht nur für Klassen und Objekte verwendet werden, sondern auch für Funktionen, Erweiterungsmodule, Ausnahmen usw.
Was bewirkt Reflexion?
Reflection kann zur Dokumentenerstellung verwendet werden. Daher können Sie damit die Klassen in der Datei scannen und nacheinander Beschreibungsdokumente generieren.
Da Reflektion die interne Struktur einer Klasse erkennen kann, kann sie als Hook für die Implementierung von Plug-in-Funktionen verwendet werden? Oder ist es ein dynamischer Proxy?
Zum Beispiel:
<?php class mysql { function connect($db) { echo "连接到数据库${db[0]}\r\n"; } } class sqlproxy { private $target; function construct($tar) { $this->target[] = new $tar(); } function call($name, $args) { foreach ($this->target as $obj) { $r = new ReflectionClass($obj); if ($method = $r->getMethod($name)) { if ($method->isPublic() && !$method->isAbstract()) { echo "方法前拦截记录LOG\r\n"; $method->invoke($obj, $args); echo "方法后拦截\r\n"; } } } } } $obj = new sqlproxy('mysql'); $obj->connect('member');
In der normalen Entwicklung gibt es nicht viele Orte, an denen Reflexion verwendet wird: Eine dient zum Debuggen von Objekten und die andere zum Abrufen von Klasseninformationen. In der MVC- und Plug-In-Entwicklung ist die Verwendung von Reflektion sehr verbreitet, aber Reflektion ist auch sehr teuer. Missbrauchen Sie sie nicht, wenn Sie eine Alternative finden können.
Oft kann eine gute Verwendung von Reflektion den Code elegant und prägnant halten, aber Reflektion kann auch die Kapselung der Klasse zerstören, da Reflektion die Offenlegung von Methoden oder Eigenschaften erzwingen kann, die nicht verfügbar gemacht werden sollten Beide Vorteile sind auch Nachteile.
Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website: PHP-Video-Tutorial
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung des PHP-Reflektionsmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!