Einführung in die PHP Reflection API

Hallo Habr! Ich präsentiere Ihnen die Übersetzung des Artikels " Einführung in die PHP Reflection API " von Mustafa Magdi .

So analysieren Sie die Datenstruktur in PHP




Eintrag


Als ich anfing, in PHP zu programmieren, wusste ich nichts über die Funktionen der Reflection-API . Der Hauptgrund ist, dass ich meine einfachen Klassen, Module oder sogar Pakete nicht entwerfen musste. Dann entdeckte ich, dass dies in vielen Bereichen eine große Rolle spielt. In diesem Artikel werden wir die Reflection-API in folgenden Punkten betrachten:

  1. Was ist die Reflection-API ?
  2. Installation und Konfiguration
  3. Verwenden Sie
  4. Fazit
  5. Empfehlungen


1. Was ist die Reflection-API?


In der Informatik bedeutet Reflexion oder Reflexion (das Holonym für Selbstbeobachtung, englische Reflexion) einen Prozess, bei dem ein Programm zur Laufzeit seine eigene Struktur und sein eigenes Verhalten verfolgen und ändern kann. - Wikipedia .
Was bedeutet die Möglichkeit, anzuhalten und in Ihren Code zu schauen ( Reverse Engineering )? Schauen wir uns das folgende Code-Snippet an:

/** * Class Profile */ class Profile { /** * @return string */ public function getUserName(): string { return 'Foo'; } } 

Die Profilklasse ist eine Blackbox. Mit der Reflection-API können Sie lesen, was sich darin befindet:

 //  $reflectionClass = new ReflectionClass('Profile'); //    var_dump($reflectionClass->getName()); => output: string(7) "Profile" //    var_dump($reflectionClass->getDocComment()); => output: string(24) "/** * Class Profile */" 

Daher fungiert die ReflectionClass als Analyst für unsere Profilklasse , und dies ist die Hauptidee der Reflection-API .

PHP gibt Ihnen den Schlüssel zu jeder verschlossenen Box, also haben wir die Schlüssel
für Folgendes:
ReflectionClass : Gibt Klasseninformationen aus.
ReflectionFunction : Meldet Funktionsinformationen.
ReflectionParameter : Ruft Informationen zu den Parametern einer Funktion oder Methode ab.
ReflectionClassConstant : Gibt Informationen zu Klassenkonstanten aus.

Sie können die vollständige Liste auf php.net studieren

2. Installation und Konfiguration


Um die Reflection-API- Klassen zu verwenden, müssen Sie nichts installieren oder konfigurieren, da sie Teil des PHP-Kerns sind.

3. Anwendungsbeispiele


Im Folgenden finden Sie einige Beispiele für die Verwendung der Reflection-API :

Beispiel 1:
Holen Sie sich die übergeordnete Klasse für eine bestimmte Klasse:

 //   class Child extends Profile { } $class = new ReflectionClass('Child'); //     print_r($class->getParentClass()); // ['Profile'] 

Beispiel 2:
getUserName() Sie die Dokumentation für die Methode getUserName() :

 $method = new ReflectionMethod('Profile', 'getUserName'); var_dump($method->getDocComment()); => output: string(33) "/** * @return string */" 

Beispiel 3:
Es kann als instanceOf und is_a() , um Objekte zu validieren:

 $class = new ReflectionClass('Profile'); $obj = new Profile(); var_dump($class->isInstance($obj)); // bool(true) //    var_dump(is_a($obj, 'Profile')); // bool(true) //    var_dump($obj instanceof Profile); // bool(true) 

Beispiel 4:
In einigen Situationen kann es vorkommen, dass Sie beim Testen von Einheiten nicht weiterkommen und sich fragen: "Wie kann ich eine private Funktion testen ?!"

Keine Sorge, hier ist der Trick:

 //    getName() private function getName(): string { return 'Foo'; } $method = new ReflectionMethod('Profile', 'getUserName'); //          if ($method->isPrivate()) { $method->setAccessible(true); } echo $method->invoke(new Profile()); // Foo 

Die vorherigen Beispiele sind ziemlich einfach, aber es gibt andere Beispiele, in denen Sie sehen können, wie die Reflection-API häufiger verwendet wird:
  • API-Dokumentationsgenerator : Das Paket lavarel-apidoc-generator verwendet ReflectionClass und ReflrectionMethod in großem Umfang , um Informationen zu Dokumentationsblöcken für Klassen und Methoden abzurufen und anschließend zu verarbeiten und diese Codeblöcke zu formatieren .
  • Abhängigkeitsinjektionscontainer : Hier können Sie das gesamte Thema überprüfen

4. Fazit


PHP bietet eine vollständige Reflection-API , mit der Sie verschiedene Bereiche von OOP-Strukturen problemlos erreichen können.

5. Referenzen



Vom Übersetzer:

Sie können auch ein Beispiel für die Verwendung der Reflection-API im Codeception-Paket in der Stub- Klasse sehen.
Diese Klasse hilft durch Reflexion, Methoden und Eigenschaften in Unit-Tests einzutauchen.

Es sollte hinzugefügt werden, dass die Reflection-API ziemlich langsam arbeitet, damit Sie sich nicht zu sehr einmischen. Es wird empfohlen, es in Tests oder während des Debuggens zu verwenden. Wenn Sie jedoch darauf verzichten können, ist es besser, dies zu tun. Und es wird kategorisch nicht für die Verwendung im Arbeitscode des Projekts empfohlen, da es ist auch nicht sicher.

Source: https://habr.com/ru/post/de433266/


All Articles