PHP の高度な機能 - リフレクションの詳細な例

伊谢尔伦
リリース: 2023-03-12 09:20:01
オリジナル
1393 人が閲覧しました

1. リフレクションとは何ですか?

PHPの実行状態でPHPプログラムの分析を拡張し、アノテーションを含むクラス、メソッド、プロパティ、パラメータなどの詳細情報をエクスポートまたは抽出することを指します。この動的に情報を取得し、オブジェクトのメソッドを動的に呼び出す機能をリフレクションAPIと呼びます。
Reflection は、オブジェクト指向パラダイム メタモデルを操作するための API であり、非常に強力で、複雑でスケーラブルなアプリケーションの構築に役立ちます。

2. リフレクションの用途

その用途には以下が含まれます: プラグインの自動読み込み、ドキュメントの自動生成、さらには PHP 言語の拡張にも使用できます。

3. リフレクションの具体的な応用例 - CIフレームワークの実装例を例にします

リフレクション機能は非常に強力ですが、具体的にはどのように使用すればよいのでしょうか?応用シナリオは何ですか? CI フレームワークの CI_Upload クラスを例に挙げて説明します。 (ReflectionClass をグローバルに検索した後、ここでリフレクションが役立つことがわかりました。)

このメソッドの中心的なロジックは、呼び出し元が CI_Upload をインスタンス化するときに $config 配列を渡し、配列内のすべての構成が対応するコンポーネントに割り当てられることです。クラスメンバーの属性 (属性に対応する set_* メソッドがある場合は、set_* メソッドを呼び出します)

メソッド 1. リフレクションなしでメソッドを記述する:

public function initialize(array $config = array(), $reset = TRUE){
    $reflection = new ReflectionClass($this);
...    #遍历config,如果存在set_方法调用set方法,没有则直接赋值
    foreach ($config as $key => $v) {        if (method_exists($this, 'set_' . $key)) {            $this->{'set_' . $key}($v);
        }else{            $this->$key =$v;
        }
    }
...
ログイン後にコピー

このメソッドには欠点があります: config 配列が正当であるかどうかは、クラス
のメンバー属性であるかどうかをリフレクションを使用して判断できます。
ここでのリフレクションの利点は、クラスに属性 (hasProperty),和判断类是否存在方法(hasMethod) があるかどうかを判断できることです。

方法2.CIフレームワーク内での実装

D:\project\app\system\libraries\Upload.php/**
 * Initialize preferences
 *
 * @param   array   $config
 * @param   bool    $reset
 * @return  CI_Upload
 */public function initialize(array $config = array(), $reset = TRUE){
    $reflection = new ReflectionClass($this);
...    foreach ($config as $key => &$value)
    {        if ($key[0] !== '_' && $reflection->hasProperty($key))
        {            if ($reflection->hasMethod('set_'.$key))
            {                $this->{'set_'.$key}($value);
            }            else
            {                $this->$key = $value;
            }
        }
    }
...
ログイン後にコピー

4.まとめ

リフレクションについて(リフレクションクラス(ReflectionClass)であろうとリフレクション関数ReflectionFunctionであろうと、実際にはクラスと関数の違いです)覚えておいてください。 1 つ: リフレクション クラス/関数 以下を含む、クラスに関するすべての情報を取得できます。
- クラスの基本情報 (クラス名、抽象クラスかどうか、インスタンス化できるかどうか、クラスが最終クラスかどうか) abstract)
-クラスのメソッド、メソッドの有無、メソッドの戻り値、メソッドのアノテーション、メソッド名
-クラスの属性、静的プロパティ、定数
-場所 名前空間 名前空間

上記のような状況の方は、それを解決するにはリフレクションを使用するとよいでしょう:)

以上がPHP の高度な機能 - リフレクションの詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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