Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung der beiden Reflexionsklassen ReflectionClass und ReflectionMethod in PHP

Detaillierte Erläuterung der Verwendung der beiden Reflexionsklassen ReflectionClass und ReflectionMethod in PHP

伊谢尔伦
伊谢尔伦Original
2017-07-01 10:51:582446Durchsuche

Dieser Artikel stellt hauptsächlich die Anwendungsfälle der PHP-Reflexionsklasse ReflectionClass und ReflectionMethod vor und gibt ein konkretes Beispiel, auf das Sie sich beziehen können

PHP5 verfügt über eine vollständige Reflexions-API, die die Möglichkeit zum Reverse Engineering von Klassen, Schnittstellen, Funktionen, Methoden und Erweiterungen bietet.

Was ist Reflexion?

Es bezieht sich auf die Erweiterung der Analyse von PHP-Programmen im laufenden Zustand von PHP und das Exportieren oder Extrahieren detaillierter Informationen zu Klassen, Methoden, Eigenschaften, Parametern usw., einschließlich Kommentaren. Diese dynamisch gewonnenen Informationen und die Möglichkeit, Methoden von Objekten dynamisch aufzurufen, werden als Reflection APIs 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.

Wir verwenden normalerweise die ReflectionClass-Klasse und die ReflectionMethod-Klasse, zum Beispiel:

Der Code lautet wie folgt:

<?php
class Person {
 /**
  * For the sake of demonstration, we"re setting this private
  */
 private $_allowDynamicAttributes = false;
 /**
  * type=primary_autoincrement
  */
 protected $id = 0;
 /**
  * type=varchar length=255 null
  */
 protected $name;
 /**
  * type=text null
  */
 protected $biography;
 public function getId() {
  return $this->id;
 }
 public function setId($v) {
  $this->id = $v;
 }
 public function getName() {
  return $this->name;
 }
 public function setName($v) {
  $this->name = $v;
 }
 public function getBiography() {
  return $this->biography;
 }
 public function setBiography($v) {
  $this->biography = $v;
 }
}

1 ReflectionClass:

1. Eigenschaftsnamen
3. Statische Eigenschaften
5.
Namespace
Namespace6.Ob die Person-Klasse endgültig oder abstrakt ist7.Ob die Person-Klasse eine bestimmte Methode hat

Um es wiederzugeben, geben Sie als nächstes einfach die ein Klasse Übergeben Sie einfach den Namen „Person“ an ReflectionClass:


Der Code lautet wie folgt:

$class = new ReflectionClass(&#39;Person&#39;); // 建立 Person这个类的反射类  
$instance  = $class->newInstanceArgs($args); // 相当于实例化Person 类
1) Holen Sie sich die Eigenschaften (Properties):

Der Code lautet wie folgt:


Standardmäßig erhält ReflectionClass alle Eigenschaften, einschließlich privater und geschützter. Wenn Sie nur das private Attribut erhalten möchten, müssen Sie einen zusätzlichen Parameter übergeben:
$properties = $class->getProperties();
foreach($properties as $property) {
 echo $property->getName() . "\n";
}
// 输出:
// _allowDynamicAttributes
// id
// name
// biography

Der Code lautet wie folgt:


Verfügbarer Parameter Liste:
$private_properties = $class->getProperties(ReflectionProperty::IS_PRIVATE);

Der Code lautet wie folgt:


ReflectionProperty::IS_STATIC
ReflectionProperty::IS_PUBLIC
ReflectionProperty::IS_PROTECTED
ReflectionProperty::IS_PRIVATE
Der Eigenschaftsname kann über $property->getName() abgerufen werden .


2) Kommentare abrufen:

Sie können die Kommentare über getDocComment an die Unterkunft schreiben lassen.

Der Code lautet wie folgt:


foreach ($properties as $property) {
 if ($property->isProtected()) {
  $docblock = $property->getDocComment();
  preg_match(&#39;/ type\=([a-z_]*) /&#39;, $property->getDocComment(), $matches);
  echo $matches[1] . "\n";
 }
}
// Output:
// primary_autoincrement
// varchar
// text
3) Holen Sie sich die Methode der Klasse

Der Code lautet wie folgt:


getMethods()       来获取到类的所有methods。
hasMethod(string)  是否存在某个方法
getMethod(string)  获取方法
4) Ausführungsklassenmethode:


Der Code lautet wie folgt:

$instance->getName(); // 执行Person 里的方法getName
// 或者:
$method = $class->getmethod(&#39;getName&#39;); // 获取Person 类中的get
Name方法
$method->invoke($instance);    // 执行getName 方法
// 或者:
$method = $class->getmethod(&#39;setName&#39;); // 获取Person 类中的setName方法
$method->invokeArgs($instance, array(&#39;snsgou.com&#39;));
2. Über ReflectionMethod können wir Informationen über eine bestimmte Methode der Person-Klasse erhalten:

1. Ob sie „öffentlich“ oder „geschützt“ ist ", "privat" oder "statisch" Typ

2. Parameterliste der Methode

3. Anzahl der Parameter der Methode
4. Methode zur Entkalkung der Klasse


Der Code lautet wie folgt:

// 执行detail方法
$method = new ReflectionMethod(&#39;Person&#39;, &#39;test&#39;);
if ($method->isPublic() && !$method->isStatic()) {
 echo &#39;Action is right&#39;;
}
echo $method->getNumberOfParameters(); // 参数个数
echo $method->getParameters(); // 参数对象数组

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung der beiden Reflexionsklassen ReflectionClass und ReflectionMethod in PHP. 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