1. リフレクションとは何ですか?
PHPの実行状態でPHPプログラムの分析を拡張し、アノテーションを含むクラス、メソッド、プロパティ、パラメータなどの詳細情報をエクスポートまたは抽出することを指します。この動的に情報を取得し、オブジェクトのメソッドを動的に呼び出す機能をリフレクションAPIと呼びます。
Reflection は、オブジェクト指向パラダイム メタモデルを操作するための API であり、非常に強力で、複雑でスケーラブルなアプリケーションの構築に役立ちます。
その用途には以下が含まれます: プラグインの自動読み込み、ドキュメントの自動生成、さらには PHP 言語の拡張にも使用できます。
リフレクション機能は非常に強力ですが、具体的にはどのように使用すればよいのでしょうか?応用シナリオは何ですか? CI フレームワークの CI_Upload クラスを例に挙げて説明します。 (ReflectionClass をグローバルに検索した後、ここでリフレクションが役立つことがわかりました。)
このメソッドの中心的なロジックは、呼び出し元が CI_Upload をインスタンス化するときに $config 配列を渡し、配列内のすべての構成が対応するコンポーネントに割り当てられることです。クラスメンバーの属性 (属性に対応する set_* メソッドがある場合は、set_* メソッドを呼び出します)
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
) があるかどうかを判断できることです。
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; } } } ...
リフレクションについて(リフレクションクラス(ReflectionClass)であろうとリフレクション関数ReflectionFunctionであろうと、実際にはクラスと関数の違いです)覚えておいてください。 1 つ: リフレクション クラス/関数 以下を含む、クラスに関するすべての情報を取得できます。
- クラスの基本情報 (クラス名、抽象クラスかどうか、インスタンス化できるかどうか、クラスが最終クラスかどうか) abstract)
-クラスのメソッド、メソッドの有無、メソッドの戻り値、メソッドのアノテーション、メソッド名
-クラスの属性、静的プロパティ、定数
-場所 名前空間 名前空間
上記のような状況の方は、それを解決するにはリフレクションを使用するとよいでしょう:)
以上がPHP の高度な機能 - リフレクションの詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。