Dieser Artikel stellt hauptsächlich das Prinzip und die Verwendung des PHP-Reflexionsmechanismus vor und analysiert das Prinzip, die Verwendung und verwandte Aspekte des PHP-Reflexionsmechanismus in Form von Beispielen Notizen, Freunde in Not können sich darauf beziehen
Die Beispiele in diesem Artikel beschreiben die Prinzipien und die Verwendung des PHP-Reflexionsmechanismus. Teilen Sie es wie folgt als Referenz mit allen:
Reflexion
ObjektorientiertIn der Programmierung wird Objekten die Fähigkeit zur Selbstbeobachtung gegeben, und dieser Selbstbeobachtungsprozess ist Reflexion.
Reflexion, intuitives Verständnis 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 Annotationen. Diese Funktion zum dynamischen Abrufen von Informationen und zum dynamischen Aufrufen von Objektmethoden wird als Reflexions-API bezeichnet.
So verwenden Sie 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 Methode und die Attributliste dieses Schülerobjekts 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 anstelle der Reflection-API auch die Klassenfunktion 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)));
If Dieses Objekt wird von anderen Seiten übergeben. 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 ., wie 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";
Ausgabe 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 die Reflexion den Prototyp einer Klasse oder eines Objekts vollständig beschreibt. Reflection kann nicht nur für Klassen und Objekte verwendet werden, sondern auch für Funktionen, Erweiterungsmodule, Ausnahmen usw.
Welche Rolle spielt die Reflexion?
Reflexion kann zur Dokumentenerstellung genutzt 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 dazu, das Objekt zu zu debuggen, die andere dazu Klasseninformationen erhalten. 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.
PHP verfügt über die Token-Funktion, die über diesen Mechanismus einige Reflexionsfunktionen implementieren kann. Aus Sicht der Einfachheit und Flexibilität empfiehlt es sich, die bereits bereitgestellte Reflection-API zu verwenden.
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.
Das obige ist der detaillierte Inhalt vonWas ist das Prinzip des PHP-Reflexionsmechanismus? Detaillierte Erläuterung der Funktion des Reflexionsmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!