Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in die Reflexion des handgeschriebenen PHP-API-Frameworks (3)

Einführung in die Reflexion des handgeschriebenen PHP-API-Frameworks (3)

藏色散人
藏色散人nach vorne
2023-02-10 10:41:514248Durchsuche

Im vorherigen Artikel „Handgeschriebenes PHP-API-Framework – Composer-Installation und -Nutzung (2)“ haben wir die Installation und Verwendung von Composer vorgestellt. In diesem Artikel stellen wir das Konzept der Reflexion vor.

Reflexion, intuitives Verständnis besteht darin, den Abfahrtsort und die Quelle basierend auf dem Ankunftsort zu finden. Unter Reflexion versteht man 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.

Schauen wir uns zunächst eine Demo an:

<?php


function p($msg, $var)
{
    echo($msg.":".print_r($var, true)).PHP_EOL.PHP_EOL;
}


class Demo
{
    private $id;

    protected $name;

    public $skills = [];

    public function __construct($id, $name, $skills = [])
    {
        $this->id = $id;
        $this->name = $name;
        $this->skills = $skills;
    }

    public function getName()
    {
        return $this->name;
    }
    public function getSkill()
    {
        p(&#39;skill&#39;, $this->skills);
    }
}


$ref = new ReflectionClass(&#39;Demo&#39;);
if ($ref->isInstantiable()) {
    p(&#39;检查类是否可实例化isInstantiable&#39;, null);
}
$constructor = $ref->getConstructor();
p(&#39;获取构造函数getConstructor&#39;, $constructor);

$parameters = $constructor->getParameters();
foreach ($parameters as $param) {
    p(&#39;获取参数getParameters&#39;, $param);
}

if ($ref->hasProperty(&#39;name&#39;)) {
    $attr = $ref->getProperty(&#39;name&#39;);
    p(&#39;获取属性getProperty&#39;, $attr);
}

$attributes = $ref->getProperties();
foreach ($attributes as $row) {
    p(&#39;获取属性列表getProperties&#39;, $row->getName());
}

if ($ref->hasMethod(&#39;getSkill&#39;)) {
    $method = $ref->getMethod(&#39;getSkill&#39;);
    p(&#39;获取方法getMethod&#39;, $method);
}

$methods = $ref->getMethods();
foreach ($methods as $row) {
    p(&#39;获取方法列表getMethods&#39;, $row->getName());
}

$instance = $ref->newInstanceArgs([1, &#39;sai&#39;, [&#39;php&#39;, &#39;js&#39;]]);
p(&#39;newInstanceArgs&#39;, $instance);

Ausgabe:

➜  php git:(main) php reflect.php 

检查类是否可实例化isInstantiable:

获取构造函数getConstructor:ReflectionMethod Object
(
    [name] => __construct
    [class] => Demo
)


获取参数getParameters:ReflectionParameter Object
(
    [name] => id
)


获取参数getParameters:ReflectionParameter Object
(
    [name] => name
)


获取参数getParameters:ReflectionParameter Object
(
    [name] => skills
)


获取属性getProperty:ReflectionProperty Object
(
    [name] => name
    [class] => Demo
)


获取属性列表getProperties:id

获取属性列表getProperties:name

获取属性列表getProperties:skills

获取方法getMethod:ReflectionMethod Object
(
    [name] => getSkill
    [class] => Demo
)


获取方法列表getMethods:__construct

获取方法列表getMethods:getName

获取方法列表getMethods:getSkill

newInstanceArgs:Demo Object
(
    [id:Demo:private] => 1
    [name:protected] => sai
    [skills] => Array
        (
            [0] => php
            [1] => js
        )

)

Die ReflectionClass-Klasse wird in der Demo natürlich nicht auf diese Methoden beschränkt.

Weitere Methoden

Die ReflectionClass-Klasse verfügt über viele weitere Methoden:

ReflectionClass::getMethodsReflectionClass ::getNamespaceName ReflectionClass::getParentClassReflectionClass::getPropertiesReflectionClass: :getPropertyReflectionClass::getReflectionConstantReflectionClass::getReflectionConstants h ortNameGibt ein Array zurück der von dieser Klasse verwendeten MerkmaleÜberprüfen Sie, ob die Konstante definiert wurdeÜberprüfen Sie, ob die Methode definiert wurde Überprüfen Sie, ob die Eigenschaft definiert wurde Überprüfen Sie, ob die Klasse ist eine abstrakte Klasse (abstrakt). isFinalÜberprüfen Sie, ob die Klasse als final deklariert ist Klasse::isInterface Überprüfen Sie, ob die Klasse eine Schnittstelle ist ReflectionClass::isInternalÜberprüfen Sie, ob die Klasse intern durch Erweiterung oder Kern definiert ist ReflectionClass::isIterableÜberprüfen Sie, ob diese Klasse iterierbar istReflectionClass:: isIterateableÜberprüfen Sie, ob iterierbar (iterierbar)ReflectionClass::isSubclassOf Überprüfen Sie, ob es sich um eine Unterklasse handeltReflectionClass::isTraitgibt zurück, ob es sich um ein Merkmal handeltReflectionClass::isUserDefinedÜberprüfen Sie, ob es vom Benutzer definiert ist. ReflectionClass::newInstanceWithoutConstructorErstellen Sie eine neue Klasseninstanz, ohne ihren Konstruktor aufzurufen. ReflectionClass::setStaticPropertyValue. Legen Sie den Wert einer statischen Eigenschaft fest String Return ReflectionClass Der String Darstellung des Objekts.

Zusätzlich zur leistungsstarken ReflectionClass gibt es auch Reflection, ReflectionClassConstant, ReflectionMethod, ReflectionFunctionAbstract usw. Es wird empfohlen, das Handbuch zu lesen:

Praktische Anwendung von Reflection

  • Reflection kann zur Dokument- und Dateigenerierung verwendet werden. Sie können es verwenden, um die Klassen in der Datei zu scannen und Beschreibungsdokumente einzeln zu generieren.

  • Da Reflection die interne Struktur der Klasse erkennen kann, können Sie es als Hook zum Implementieren von Plug-in-Funktionen verwenden

  • kann verwendet werden, um dynamische Proxys zu erstellen und zu instanziieren, wenn der Klassenname unbekannt oder unsicher ist.
  • Abhängigkeitsinjektion. Bei Klassen, die mehrfach erben, können wir die Struktur der Basisklasse durch mehrere Reflexionen untersuchen oder die rekursive Reflexion verwenden, um alle geerbten Klassen zu instanziieren. Dies ist auch das Prinzip der PHP-Abhängigkeitsinjektion.
Vorteile der Reflexion

    Sprachen, die Reflexion unterstützen, bieten einige Laufzeitfunktionen, die in Low-Level-Sprachen nur schwer zu implementieren sind.
  • kann hartes Codieren bis zu einem gewissen Grad vermeiden und Flexibilität und Vielseitigkeit bieten.
  • kann als erstklassiges Objekt zum Erkennen und Ändern der Struktur des Quellcodes (z. B. Codeblöcke, Klassen, Methoden, Protokolle usw.) verwendet werden.
  • Sie können symbolische Syntaxzeichenfolgen zur Laufzeit genau wie Quellcodeanweisungen berechnen (ähnlich der eval()-Funktion von JavaScript) und dann Zeichenfolgen, die mit einer Klasse oder Funktion übereinstimmen, in Aufrufe oder Verweise auf eine Klasse oder Funktion konvertieren.
  • Es ist möglich, einen neuen Sprachbytecode-Interpreter zu erstellen, um Programmierkonstrukten eine neue Bedeutung oder einen neuen Zweck zu geben.
Nachteile der Reflexion

    Hohe Lernkosten. Reflexionsorientierte Programmierung erfordert fortgeschrittenere Kenntnisse, einschließlich Frameworks, relationaler Zuordnung und Objektinteraktion, um die Vorteile einer allgemeineren Codeausführung zu nutzen
  • Auch weil das Konzept und die Syntax der Reflexion relativ abstrakt sind, wird die Reflexionstechnologie übermäßig missbraucht machen Der Code ist für andere schwer zu verstehen, was der Zusammenarbeit und Kommunikation nicht förderlich ist
  • Während Reflexion die Flexibilität des Codes verbessert, opfert sie ein wenig Betriebseffizienz und hat einen gewissen Verbrauch
  • Reflexion wird Zerstören Sie auch die Kapselung der Klasse und legen Sie Methoden oder Attribute offen, die nicht offengelegt werden sollten
  • In der täglichen Entwicklung verwenden wir eigentlich nicht viel Reflexion. Warum also hierher bringen? Erstens werden wir Reflection später verwenden, um den Ioc-Container zu implementieren. Zweitens ist Reflection auch eine der Kernfunktionen von PHP. Sie ist in unseren gängigen Frameworks sehr verbreitet und muss verstanden werden.

Dieser Abschnitt ist relativ unabhängig, wir werden ihn in den folgenden Kapiteln verwenden.

Empfohlenes Lernen: „

PHP-Video-Tutorial

Methode Beschreibung
ReflectionClass::__construct Initialisieren Sie die ReflectionClass-Klasse
ReflectionClass::export Eine Klasse exportieren
ReflectionClass::getConstant Erhalten Sie die Definition Eine Konstante
ReflectionClass::getConstants Erhalten Sie eine Reihe von Konstanten
ReflectionClass::getConstructor Erhalten Sie den Konstruktor der Klasse die Standardeigenschaften
ReflectionClass: ;
Erhalten Sie das Array von Methoden Name
Den Namen des Namespace abrufen
Die übergeordnete Klasse abrufen
Eine Reihe von Eigenschaften abrufen
Holen Sie sich ein Attribut einer Klasse ReflectionProperty
Ruft eine ReflectionClassConstant für die Konstante einer Klasse ab
Ruft Klassenkonstanten ab
Holen Sie sich den Kurznamen ReflectionClass: ;
ReflectionClass::hasConstant
ReflectionClass::hasMethod
ReflectionClass::hasProperty

Das obige ist der detaillierte Inhalt vonEinführung in die Reflexion des handgeschriebenen PHP-API-Frameworks (3). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.im. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen