Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Prinzipien und Verwendung des Reflexionsmechanismus in PHP mit Bildern und Text

Detaillierte Erläuterung der Prinzipien und Verwendung des Reflexionsmechanismus in PHP mit Bildern und Text

墨辰丷
墨辰丷Original
2018-05-25 14:31:291174Durchsuche

Dieser Artikel stellt hauptsächlich das Prinzip und die Verwendung des PHP-Reflexionsmechanismus vor und analysiert das Prinzip, die Verwendung und die damit verbundenen Vorsichtsmaßnahmen in Form von Beispielen. Freunde in Not können sich darauf beziehen

Dieser Artikel beschreibt PHP mit Beispielen, Prinzipien und Verwendung des Reflexionsmechanismus. Teilen Sie es wie folgt als Referenz mit allen:

Reflexion

Bei der objektorientierten Programmierung erhalten Objekte die Fähigkeit zur Selbstbeobachtung, 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 Kommentaren. 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 &#39;未设置&#39;;
       
     $this->$name="正在为你设置默认值";
  }
  return $this->$name;
  }
}
$student=new person();
$student->name=&#39;Tom&#39;;
$student->gender=&#39;male&#39;;
$student->age=24;

Was ist nun zu tun, um die Methoden- und Eigenschaftenliste dafür zu erhalten? Studentenobjekt Wolltuch? 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)));

Wenn dieses Objekt von anderen Seiten übergeben wird, woher wissen Sie dann, zu welcher Klasse es gehört? Sie können es mit nur einer Codezeile erledigen:

// 获取对象属性列表所属的类
echo get_class($student);

Die Reflection-API ist offensichtlich leistungsfähiger und kann sogar den Prototyp dieser Klasse einschließlich der Methode wiederherstellen Zugriffsberechtigungen usw., wie zum Beispiel:

// 反射获取类的原型
$obj = new ReflectionClass(&#39;person&#39;);
$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() ? &#39; public&#39; : &#39;&#39;,$v->isPrivate() ? &#39; private&#39; : &#39;&#39;,
    $v->isProtected() ? &#39; protected&#39; : &#39;&#39;,
    $v->isStatic() ? &#39; static&#39; : &#39;&#39;;
    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 weitere PHP-Handbücher zur Reflection-API. Man kann sagen, dass Reflection 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(&#39;mysql&#39;);
$obj->connect(&#39;member&#39;);

In der normalen Entwicklung gibt es nicht viele Orte, an denen Reflexion verwendet wird: Einer dient zum Debuggen von Objekten und der andere other ist Klasseninformationen abrufen. 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 Gründen 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 gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich sein wird.


Verwandte Empfehlungen:

PHP objektorientiert ReflexionFunktion und Verwendung

PHPReflectionDetaillierte Erläuterung der Mechanismusbeispiele

PHP-KlasseReflectionDetaillierte Erläuterung der zu implementierenden Schritte Abhängigkeitsinjektion

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Prinzipien und Verwendung des Reflexionsmechanismus in PHP mit Bildern und Text. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn