ホームページ >バックエンド開発 >PHPチュートリアル >PHP変数のリフレクションと使用、および型拡張
1. 概要とインストール
PHP 5 には完全なリフレクション API があり、クラス、インターフェイス、関数、メソッド、拡張機能をリバース エンジニアリングする機能が追加されています。 さらに、Reflection API は、関数、クラス、メソッドからドキュメント コメントを抽出するメソッドを提供します。
一部の内部 API には、リフレクション拡張機能が機能するために必要なコードが欠落していることに注意してください。 たとえば、組み込みの PHP クラスで、反映されたプロパティのデータが欠落している可能性があります。ただし、これらのまれなケースはバグとみなされているため、発見して修正する必要があります。
これらの関数を使用するためにインストールは必要ありません。これらは PHP コアの一部です。
2. 使用例
リフレクションのドキュメントには多くの例があり、通常は各クラスの __construct ドキュメントにあります。
例 シェル(端末)でのリフレクション例
$ php --rf strlen
$ php --rc finfo
$ php --re json
$ php --ri dom
上記ルーチンの出力類似したもの:
Function [ <internal:Core> function strlen ] { - Parameters [1] { Parameter #0 [ <required> $str ] } } Class [ <internal:fileinfo> class finfo ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [0] { } - Methods [4] { Method [ <internal:fileinfo, ctor> public method finfo ] { - Parameters [2] { Parameter #0 [ <optional> $options ] Parameter #1 [ <optional> $arg ] } } Method [ <internal:fileinfo> public method set_flags ] { - Parameters [1] { Parameter #0 [ <required> $options ] } } Method [ <internal:fileinfo> public method file ] { - Parameters [3] { Parameter #0 [ <required> $filename ] Parameter #1 [ <optional> $options ] Parameter #2 [ <optional> $context ] } } Method [ <internal:fileinfo> public method buffer ] { - Parameters [3] { Parameter #0 [ <required> $string ] Parameter #1 [ <optional> $options ] Parameter #2 [ <optional> $context ] } } } } Extension [ <persistent> extension #23 json version 1.2.1 ] { - Constants [10] { Constant [ integer JSON_HEX_TAG ] { 1 } Constant [ integer JSON_HEX_AMP ] { 2 } Constant [ integer JSON_HEX_APOS ] { 4 } Constant [ integer JSON_HEX_QUOT ] { 8 } Constant [ integer JSON_FORCE_OBJECT ] { 16 } Constant [ integer JSON_ERROR_NONE ] { 0 } Constant [ integer JSON_ERROR_DEPTH ] { 1 } Constant [ integer JSON_ERROR_STATE_MISMATCH ] { 2 } Constant [ integer JSON_ERROR_CTRL_CHAR ] { 3 } Constant [ integer JSON_ERROR_SYNTAX ] { 4 } } - Functions { Function [ <internal:json> function json_encode ] { - Parameters [2] { Parameter #0 [ <required> $value ] Parameter #1 [ <optional> $options ] } } Function [ <internal:json> function json_decode ] { - Parameters [3] { Parameter #0 [ <required> $json ] Parameter #1 [ <optional> $assoc ] Parameter #2 [ <optional> $depth ] } } Function [ <internal:json> function json_last_error ] { - Parameters [0] { } } } } dom DOM/XML => enabled DOM/XML API Version => 20031129 libxml Version => 2.7.3 HTML Support => enabled XPath Support => enabled XPointer Support => enabled Schema Support => enabled RelaxNG Support => enabled
3. 関連拡張機能
組み込みクラスの特殊なバージョンを作成する場合 (たとえば、強調表示された HTML を作成およびエクスポートするとき、メソッドを簡単にアクセス可能なメンバー変数に置き換える、またはユーティリティ メソッドを使用する) 場合は、次のことができます。それらを継続し、拡張します。
例 #1 組み込みクラスの拡張
<?php /** * My Reflection_Method class */ class My_Reflection_Method extends ReflectionMethod { public $visibility = array(); public function __construct($o, $m) { parent::__construct($o, $m); $this->visibility = Reflection::getModifierNames($this->getModifiers()); } } /** * Demo class #1 * */ class T { protected function x() {} } /** * Demo class #2 * */ class U extends T { function x() {} } // 输出信息 var_dump(new My_Reflection_Method('U', 'x')); ?> 以上例程的输出类似于: object(My_Reflection_Method)#1 (3) { ["visibility"]=> array(1) { [0]=> string(6) "public" } ["name"]=> string(1) "x" ["class"]=> string(1) "U" }
コンストラクターをオーバーライドする場合は、挿入されたコードを記述する前に親クラスのコンストラクターを呼び出すことを忘れないでください。 これを行わないと、次の結果が発生します: 致命的エラー: 内部エラー: リフレクション オブジェクトの取得に失敗しました
4. Reflection クラス
Reflection — Reflection クラス
ReflectionClass — ReflectionClass クラス
ReflectionZendExtension — ReflectionZendExtension クラス
ReflectionExtension — ReflectionExtension クラス
ReflectionFunction — ReflectionFunction クラス
ReflectionFunctionAbstract — ReflectionFunctionAbstract クラス
ReflectionMethod — ReflectionMethod クラス
ReflectionObject — ReflectionObject クラス
ReflectionParameter — ionParameter クラス
ReflectionProperty — ReflectionProperty クラス
Reflector — リフレクター インターフェイス
ReflectionException — ReflectionException クラス