Heim >Backend-Entwicklung >PHP-Tutorial >Selbstbeobachtung und Reflexion in PHP
Kernpunkte
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. ReflectionClass
Klassen sind die Hauptklassen von APIs, mit denen Reflexionen auf Klassen, Schnittstellen und Methoden angewendet werden. 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 get_class()
- Geben Sie den Klassennamen des Objekts get_parent_class()
- Gibt den Klassennamen der übergeordneten Klasse des Objekts is_subclass_of()
- Überprüfen Sie, ob das Objekt eine bestimmte übergeordnete Klasse 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 get_class_methods()
- Geben Sie den Namen der Klassenmethode get_class_vars()
- Geben Sie das Standardattribut der Klasse interface_exists()
- Überprüfen Sie, ob die Schnittstelle method_exists()
- Überprüfen Sie, ob das Objekt eine Methode <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
,
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!