ホームページ >バックエンド開発 >PHPチュートリアル >PHPの内省と反射
コアポイント
class_exists()
、get_class()
、get_parent_class()
、is_subclass_of()
などのさまざまな内省関数を提供します。これらの関数は、名前、親クラスの名前など、クラスに関する基本的な情報を提供します。 ReflectionClass
クラスは、クラス、インターフェイス、およびメソッドに反射を適用するために使用されるAPIの主要なクラスです。
php内省関数
最初の例では、PHPのいくつかの内省関数を示します。これらの関数を使用して、その名前、親クラスの名前など、クラスに関する基本的な情報を抽出できます。
class_exists()
get_class()
get_parent_class()
is_subclass_of()
およびIntrospection
クラスの定義を含むPHPコードの例です。
Child
<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>
class_exists()
メソッドを使用して、指定されたクラスが定義されているかどうかを判断できます。これは、チェックする必要なクラスの名前を表す文字列パラメーターと、手順中にオートローダーが呼び出されるかどうかを示すオプションのブール値を使用できます。 get_class()
およびget_parent_class()
メソッドは、オブジェクトのクラス名または親クラスのクラス名をそれぞれ返します。どちらもパラメーターとしてオブジェクトインスタンスを取ります。 is_subclass_of()
インターフェイスとICurrencyConverter
クラスの定義と、上記の関数によって抽出された情報出力を含む2番目の例です。最初の例と同様に、最初に関数をリストし、次にコードを表示します。 GBPCurrencyConverter
get_declared_classes()
get_class_methods()
get_class_vars()
interface_exists()
method_exists()
<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>上記のコードの出力は次のとおりです。
あなたが推測したかもしれないように、
メソッドは、最初の例で説明した<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>メソッドと非常に似ています。指定されたインターフェイスが定義されているかどうかを決定し、インターフェイス名の文字列パラメーターとオプションのAutoloader Booleanを使用します。
メソッドは、引数なしで定義されたすべてのクラスの名前を含む配列を返します。ロードしたライブラリ(PHPにコンパイルするか、interface_exists()
/class_exists()
を使用して読み込まれた)に応じて、他のクラスが存在する場合があります。 get_declared_classes()
必要なクラスをパラメーターとして表すオブジェクトインスタンスまたは文字列を使用し、クラスで定義されたメソッド名の配列を返します。 require
クラスで定義されているすべてのプロパティのうち、include
メソッドによって返されるすべてのプロパティのうち、get_class_method()
とICurrencyConverter
のみが出力に表示されることに注意してください。プライベートおよび保護されたプロパティがスキップされます。 get_class_vars()
$name
$rates
php反射API PHPは、その反射APIを介して反射をサポートします。 PHPマニュアルからわかるように、反射APIは内省メカニズムよりもはるかに寛大であり、反射タスクを完了するために使用できる多数のクラスと方法を提供します。クラスはAPIのメインクラスであり、クラス、インターフェイス、メソッドに反射を適用し、すべてのクラスコンポーネントに関する情報を抽出するために使用されます。リフレクションはアプリケーションコードに簡単に実装でき、内省と同じくらい直感的です。以下は、
インターフェイスとおよびクラスを使用してリフレクションを示す例を示します。
<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>
上記のコードの出力は次のとおりです。
<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>
メソッドは、クラスの実装のインターフェイス名を含む配列を返します。 getInterfaceNames()
メソッドは、親クラスのgetParentClass()
オブジェクト表現を返すことができ、親クラスが存在しない場合はfalseを返すことができます。上記のコードに示すように、ReflectionClass
オブジェクトの名前を一覧表示するには、ReflectionClass
メソッドを使用できます。 getName()
メソッドはメソッドアレイを取得し、ビットマスクをgetMethods()
、ReflectionMethod::IS_STATIC
、IS_PUBLIC
、IS_PROTECTED
、IS_PRIVATE
、IS_ABSTRACT
、IS_FINAL
、
概要
この記事では、PHPの内省的機能と反射APIを使用して、クラス、インターフェイス、プロパティ、および方法に関する情報を取得する方法を学びました。この情報を抽出する目的は、実行時にコードをよりよく理解し、複雑なアプリケーションを作成することです。
(フォトリアからの写真)
(PHPの内省と反射に関するFAQ 必要に応じて、FAQの質問を個別に尋ねることができます。
以上がPHPの内省と反射の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。