Heim >Backend-Entwicklung >PHP-Tutorial >Selbstbeobachtung und Reflexion in PHP

Selbstbeobachtung und Reflexion in PHP

Jennifer Aniston
Jennifer AnistonOriginal
2025-02-27 08:35:13117Durchsuche

Introspection and Reflection in PHP

Kernpunkte

    Mit
  • PHPs Introspection -Mechanismus können Programmierer Objektklassen manipulieren und Klassen, Schnittstellen, Eigenschaften und Methoden überprüfen. Dies ist besonders nützlich, wenn die zum Zeitpunkt des Designs ausführende Klasse oder Methode unbekannt ist.
  • PHP liefert verschiedene Selbstbeobachtungsfunktionen wie class_exists(), get_class(), get_parent_class() und is_subclass_of(). Diese Funktionen liefern grundlegende Informationen zu Klassen wie ihren Namen, den Namen der übergeordneten Klassen usw.
  • Die Reflexions-API von
  • PHP liefert introspektativartige Funktionen und bereitet die Anzahl der Klassen und Methoden zur Erfüllung von Reflexionsaufgaben aus. ReflectionClass Klassen sind die Hauptklassen von APIs, mit denen Reflexionen auf Klassen, Schnittstellen und Methoden angewendet werden.
  • Selbstbeobachtung und Reflexion in PHP sind leistungsstarke Tools, mit denen Entwickler ihren Code zur Laufzeit besser verstehen, komplexe Anwendungen erstellen und das Laufzeitverhalten von Objekten ändern können. Sie sollten jedoch mit Vorsicht verwendet werden, da sie den Code komplexer und schwer zu verstehen können.

PHP -Selbstbekämpfung ist eine gemeinsame Funktion in jeder Programmiersprache, mit der Programmierer Objektklassen manipulieren können. Sie finden Selbstbeobachtung besonders nützlich, wenn Sie nicht wissen, welche Klasse oder Methode Sie beim Entwerfen ausführen müssen. Die Introspection in PHP bietet nützliche Funktionen für das Überprüfen von Klassen, Schnittstellen, Eigenschaften und Methoden. PHP bietet eine große Anzahl von Funktionen, mit denen diese Aufgabe erledigt werden kann. Um die Selbstbeobachtung zu verstehen, werde ich die Beispiele in PHP verwenden, um einige der Klassen, Methoden und Funktionen von PHP kurz zu skizzieren, um die Verwendung zu unterstreichen. In diesem Artikel werden einige Beispiele dafür angezeigt, wie einige der nützlichsten PHP -Introspection -Funktionen verwendet werden können, sowie einen Abschnitt, der sich der Bereitstellung einer API (reflektierende API) ähnelt, die der Selbstbekämpfung ähnelt.

PHP -Introspection -Funktion

Im ersten Beispiel werde ich einige Selbstbeobachtungsfunktionen von PHP demonstrieren. Sie können diese Funktionen verwenden, um grundlegende Informationen zu Klassen wie deren Namen, den Namen der übergeordneten Klasse usw. zu extrahieren.

  • class_exists() - Überprüfen Sie, ob die Klasse
  • definiert wurde
  • get_class() - Geben Sie den Klassennamen des Objekts
  • zurück
  • get_parent_class() - Gibt den Klassennamen der übergeordneten Klasse des Objekts
  • zurück
  • is_subclass_of() - Überprüfen Sie, ob das Objekt eine bestimmte übergeordnete Klasse
  • hat

Das Folgende ist ein Beispiel -PHP -Code, der die Klassendefinitionen Introspection und Child sowie die von der oben aufgeführten Funktion extrahierten Informationen enthält:

<code class="language-php"><?php
class Introspection {
    public function description() {
        echo "I am a super class for the Child class.\n";
    }
}

class Child extends Introspection {
    public function description() {
        echo "I'm " . get_class($this) , " class.\n";
        echo "I'm " . get_parent_class($this) , "'s child.\n";
    }
}

if (class_exists("Introspection")) {
    $introspection = new Introspection();
    echo "The class name is: " . get_class($introspection) . "\n";
    $introspection->description();
}

if (class_exists("Child")) {
    $child = new Child();
    $child->description();

    if (is_subclass_of($child, "Introspection")) {
        echo "Yes, " . get_class($child) . " is a subclass of Introspection.\n";
    } else {
        echo "No, " . get_class($child) . " is not a subclass of Introspection.\n";
    }
}
?></code>

Die Ausgabe des obigen Codes sollte wie folgt sein:

<code class="language-php"><?php
class Introspection {
    public function description() {
        echo "I am a super class for the Child class.\n";
    }
}

class Child extends Introspection {
    public function description() {
        echo "I'm " . get_class($this) , " class.\n";
        echo "I'm " . get_parent_class($this) , "'s child.\n";
    }
}

if (class_exists("Introspection")) {
    $introspection = new Introspection();
    echo "The class name is: " . get_class($introspection) . "\n";
    $introspection->description();
}

if (class_exists("Child")) {
    $child = new Child();
    $child->description();

    if (is_subclass_of($child, "Introspection")) {
        echo "Yes, " . get_class($child) . " is a subclass of Introspection.\n";
    } else {
        echo "No, " . get_class($child) . " is not a subclass of Introspection.\n";
    }
}
?></code>

Sie können die class_exists() -Methode verwenden, um festzustellen, ob die angegebene Klasse definiert wurde, wodurch ein String -Parameter verwendet wird, der den Namen der erforderlichen Klasse darstellt, und einen optionalen booleschen Wert, der angibt, ob der Autoloader während des Verfahrens aufgerufen wird. Die Methoden get_class() und get_parent_class() geben den Klassennamen des Objekts bzw. den Klassennamen seiner übergeordneten Klasse zurück. Beide nehmen Objektinstanzen als Parameter. Die is_subclass_of() -Methode nimmt die Objektinstanz als erster Parameter und nimmt eine Zeichenfolge, die den Namen der übergeordneten Klassen als zweiten Parameter darstellt, und gibt zurück, ob das Objekt zu einer Unterklasse der als Parameter angegebenen Klasse gehört.

Das Folgende ist ein zweites Beispiel, das die Definitionen der ICurrencyConverter -Krinne und der GBPCurrencyConverter -Kläufe sowie die von den oben aufgeführten Funktionen extrahierten Informationsausgaben enthält. Wie beim ersten Beispiel werde ich zuerst die Funktionen auflisten und Ihnen dann einen Code zeigen.

  • get_declared_classes() - Kehren Sie zu einer Liste aller deklarierten Klassen
  • zurück
  • get_class_methods() - Geben Sie den Namen der Klassenmethode
  • zurück
  • get_class_vars() - Geben Sie das Standardattribut der Klasse
  • zurück
  • interface_exists() - Überprüfen Sie, ob die Schnittstelle
  • definiert ist
  • method_exists() - Überprüfen Sie, ob das Objekt eine Methode
  • definiert
<code>The class name is: Introspection
I am a super class for the Child class.
I'm Child class.
I'm Introspection's child.
Yes, Child is a subclass of Introspection.</code>

Die Ausgabe des obigen Codes sollte wie folgt sein:

<code class="language-php"><?php
interface ICurrencyConverter {
    public function convert($currency, $amount);
}

class GBPCurrencyConverter implements ICurrencyConverter {
    public $name = "GBPCurrencyConverter";
    public $rates = array("USD" => 0.622846, "AUD" => 0.643478);
    protected $var1;
    private $var2;

    function __construct() {}

    function convert($currency, $amount) {
        return $this->rates[$currency] * $amount;
    }
}

if (interface_exists("ICurrencyConverter")) {
    echo "ICurrencyConverter interface exists.\n";
}

$classes = get_declared_classes();
echo "The following classes are available:\n";
print_r($classes);

if (in_array("GBPCurrencyConverter", $classes)) {
    print "GBPCurrencyConverter is declared.\n";

    $gbpConverter = new GBPCurrencyConverter();

    $methods = get_class_methods($gbpConverter);
    echo "The following methods are available:\n";
    print_r($methods);

    $vars = get_class_vars("GBPCurrencyConverter");
    echo "The following properties are available:\n";
    print_r($vars);

    echo "The method convert() exists for GBPCurrencyConverter: ";
    var_dump(method_exists($gbpConverter, "convert"));
}
?></code>

Wie Sie vielleicht vermutet haben, ist die interface_exists() -Methode der im ersten Beispiel diskutierten class_exists() -Methode sehr ähnlich. Es bestimmt, ob die angegebene Schnittstelle definiert wurde, und nimmt einen String -Parameter des Schnittstellennamens und einen optionalen Autoloader boolean an. Die Methode get_declared_classes() gibt ein Array zurück, das die Namen aller definierten Klassen ohne Argumente enthält. Abhängig von der von Ihnen geladenen Bibliothek (mit require/include in PHP kompilieren) können andere Klassen vorhanden sein. get_class_method() nimmt eine Objektinstanz oder eine Zeichenfolge, die die erforderliche Klasse als Parameter darstellt, und gibt ein Array von Methodamen zurück, die von der Klasse definiert sind. Beachten Sie, dass von allen in der ICurrencyConverter -Klasse definierten Eigenschaften und allen von der get_class_vars() -Methode zurückgegebenen Eigenschaften nur $name und $rates in der Ausgabe angezeigt werden. Private und geschützte Eigenschaften werden übersprungen.

PHP -Reflexions -API

PHP unterstützt die Reflexion durch seine Reflexions -API. Wie Sie aus dem PHP -Handbuch erkennen können, ist die Reflexions -API viel großzügiger als der Selbstbeobachtungsmechanismus und bietet eine große Anzahl von Klassen und Methoden, mit denen Sie Reflexionsaufgaben erledigen können. ReflectionClass Klassen sind die Hauptklasse der API, mit der Reflexionen auf Klassen, Schnittstellen und Methoden angewendet und Informationen zu allen Klassenkomponenten extrahiert werden. Reflexion ist in Ihrem Anwendungscode leicht zu implementieren und ist so intuitiv wie Selbstbeobachtung. Hier ist ein Beispiel, das die Reflexion mithilfe der Grenzfläche ICurrencyConverter und Child und GBPCurrencyConverter Klassen veranschaulicht:

<code class="language-php"><?php
class Introspection {
    public function description() {
        echo "I am a super class for the Child class.\n";
    }
}

class Child extends Introspection {
    public function description() {
        echo "I'm " . get_class($this) , " class.\n";
        echo "I'm " . get_parent_class($this) , "'s child.\n";
    }
}

if (class_exists("Introspection")) {
    $introspection = new Introspection();
    echo "The class name is: " . get_class($introspection) . "\n";
    $introspection->description();
}

if (class_exists("Child")) {
    $child = new Child();
    $child->description();

    if (is_subclass_of($child, "Introspection")) {
        echo "Yes, " . get_class($child) . " is a subclass of Introspection.\n";
    } else {
        echo "No, " . get_class($child) . " is not a subclass of Introspection.\n";
    }
}
?></code>

Die Ausgabe des obigen Codes sollte wie folgt sein:

<code>The class name is: Introspection
I am a super class for the Child class.
I'm Child class.
I'm Introspection's child.
Yes, Child is a subclass of Introspection.</code>
Die Methode

getInterfaceNames() gibt ein Array zurück, das die Schnittstellennamen der Klassenimplementierung enthält. Die getParentClass() -Methode kann die ReflectionClass -Objektpräparation der übergeordneten Klasse zurückgeben, und falsch, wenn die übergeordnete Klasse nicht existiert. Um die Namen der ReflectionClass -Objekte aufzulisten, können Sie die getName() -Methode verwenden, wie im obigen Code gezeigt. Die getMethods() -Methode ruft das Methodenarray ab und kann Bitmasks für ReflectionMethod::IS_STATIC, IS_PUBLIC, IS_PROTECTED, IS_PRIVATE, IS_ABSTRACT, IS_FINAL,

und

als optionale Parameter zum Filtern der Liste basierend auf der Sichtbarkeit kombinieren. Die Reflexions -API bietet eine gute Implementierung der Reflexion und ermöglicht es Ihnen, komplexere Anwendungen wie Apigen zu erstellen, aber eine weitere Diskussion geht über das Ziel dieses Artikels hinaus.

Zusammenfassung

In diesem Artikel haben Sie gelernt, wie man die introspektiven Funktionen und Reflexions -APIs von PHP verwendet, um Informationen über Klassen, Schnittstellen, Eigenschaften und Methoden zu erhalten. Der Zweck dieser Informationen besteht darin, Ihren Code zur Laufzeit besser zu verstehen und komplexe Anwendungen zu erstellen.

(Bild aus Fotolien)

(FAQ zur Introspektion und Reflexion in PHP) Der FAQ-Abschnitt wird hier weggelassen, da er zu lang ist und nicht mit dem Pseudo-Ursprungziel übereinstimmt. Bei Bedarf können Sie eine FAQ -Frage separat stellen.

Das obige ist der detaillierte Inhalt vonSelbstbeobachtung und Reflexion 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