PHPの内省と反射

Jennifer Aniston
リリース: 2025-02-27 08:35:13
オリジナル
113 人が閲覧しました

Introspection and Reflection in PHP

コアポイント

  • PHPの内省メカニズムにより、プログラマーはオブジェクトクラスを操作し、クラス、インターフェイス、プロパティ、およびメソッドを確認できます。これは、設計時に実行されるクラスまたは方法が不明な場合に特に役立ちます。
  • PHPは、class_exists()get_class()get_parent_class()is_subclass_of()などのさまざまな内省関数を提供します。これらの関数は、名前、親クラスの名前など、クラスに関する基本的な情報を提供します。
  • PHPのリフレクションAPIは、内省的な機能を提供し、反射タスクを完了するために使用されるクラスと方法の数を提供することが豊富です。 ReflectionClassクラスは、クラス、インターフェイス、およびメソッドに反射を適用するために使用されるAPIの主要なクラスです。
  • PHPの内省と反射は、開発者が実行時にコードをよりよく理解し、複雑なアプリケーションを作成し、オブジェクトのランタイム動作を変更できる強力なツールです。ただし、コードをより複雑で理解しにくくすることができるため、注意して使用する必要があります。
PHP内省は、プログラマーがオブジェクトクラスを操作できるようにするプログラミング言語の一般的な機能です。内省は、設計時に実行する必要があるクラスまたは方法がわからない場合に特に役立ちます。 PHPの内省は、クラス、インターフェイス、プロパティ、および方法をチェックするための有用な機能を提供します。 PHPは、このタスクを達成するために使用できる多数の機能を提供します。内省を理解するために、PHPの例を使用して、PHPのクラス、方法、機能の一部を簡単に概説して、使用方法を強調します。この記事では、最も有用なPHP内省関数のいくつかを使用する方法と、内省と同様のAPI(反射API)の提供に特化したセクションについての例をいくつかご覧ください。

php内省関数

最初の例では、PHPのいくつかの内省関数を示します。これらの関数を使用して、その名前、親クラスの名前など、クラスに関する基本的な情報を抽出できます。

  • - クラスが定義されているかどうかを確認しますclass_exists()
  • - オブジェクトのクラス名を返してくださいget_class()
  • - オブジェクトの親クラスのクラス名を返しますget_parent_class()
  • - オブジェクトが特定の親クラスを持っているかどうかを確認is_subclass_of()
以下は、上記の関数によって抽出された情報出力と同様に、

およびIntrospectionクラスの定義を含むPHPコードの例です。 Child

上記のコードの出力は次のとおりです。
<?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";
    }
}
?>
ログイン後にコピー
ログイン後にコピー

class_exists()メソッドを使用して、指定されたクラスが定義されているかどうかを判断できます。これは、チェックする必要なクラスの名前を表す文字列パラメーターと、手順中にオートローダーが呼び出されるかどうかを示すオプションのブール値を使用できます。 get_class()およびget_parent_class()メソッドは、オブジェクトのクラス名または親クラスのクラス名をそれぞれ返します。どちらもパラメーターとしてオブジェクトインスタンスを取ります。 メソッドは、オブジェクトインスタンスを最初のパラメーターとして取得し、親クラス名を2番目のパラメーターとして表す文字列を使用し、オブジェクトがパラメーターとして指定されたクラスのサブクラスに属しているかどうかを返します。 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>
ログイン後にコピー
ログイン後にコピー
上記のコードの出力は次のとおりです。

あなたが推測したかもしれないように、

メソッドは、最初の例で説明した
<?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"));
}
?>
ログイン後にコピー
メソッドと非常に似ています。指定されたインターフェイスが定義されているかどうかを決定し、インターフェイス名の文字列パラメーターとオプションのAutoloader Booleanを使用します。

メソッドは、引数なしで定義されたすべてのクラスの名前を含む配列を返します。ロードしたライブラリ(PHPにコンパイルするか、interface_exists()/class_exists()を使用して読み込まれた)に応じて、他のクラスが存在する場合があります。 get_declared_classes()必要なクラスをパラメーターとして表すオブジェクトインスタンスまたは文字列を使用し、クラスで定義されたメソッド名の配列を返します。 requireクラスで定義されているすべてのプロパティのうち、includeメソッドによって返されるすべてのプロパティのうち、get_class_method()ICurrencyConverterのみが出力に表示されることに注意してください。プライベートおよび保護されたプロパティがスキップされます。 get_class_vars() $name$ratesphp反射API <

PHPは、その反射APIを介して反射をサポートします。 PHPマニュアルからわかるように、反射APIは内省メカニズムよりもはるかに寛大であり、反射タスクを完了するために使用できる多数のクラスと方法を提供します。クラスはAPIのメインクラスであり、クラス、インターフェイス、メソッドに反射を適用し、すべてのクラスコンポーネントに関する情報を抽出するために使用されます。リフレクションはアプリケーションコードに簡単に実装でき、内省と同じくらい直感的です。以下は、

インターフェイスとおよびクラスを使用してリフレクションを示す例を示します。

<?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>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_STATICIS_PUBLICIS_PROTECTEDIS_PRIVATEIS_ABSTRACTIS_FINAL

のオプションパラメーターとして、可視性に基づいてリストをフィルタリングするオプションパラメーターとして組み合わせることができます。リフレクションAPIは、リフレクションの適切な実装を提供し、アピゲンなどのより複雑なアプリケーションを作成できるようにしますが、さらなる議論はこの記事の目標を超えています。

概要

この記事では、PHPの内省的機能と反射APIを使用して、クラス、インターフェイス、プロパティ、および方法に関する情報を取得する方法を学びました。この情報を抽出する目的は、実行時にコードをよりよく理解し、複雑なアプリケーションを作成することです。

(フォトリアからの写真)

(PHPの内省と反射に関するFAQ 必要に応じて、FAQの質問を個別に尋ねることができます。

以上がPHPの内省と反射の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート