リフレクションはクラスの内部構造を検出でき、プラグイン関数を実装するためのフックとして、または動的プロキシとして使用できます。
リフレクション関連
クラスおよびオブジェクトに関連する関数
get_object_vars get_class_methods get_class_vars get_class get_parent_class method_exists property_exists trait_exists
リフレクション関連の API クラス
reflectiontype reflectionproperty reflectionobject reflectionfunction reflectionmethod reflectionexception reflectionextension reflectionparameter reflectionfunctionabstract reflectiongenerator reflectionclass reflectionclassconstant reflectionzendextension
Reflection API はより強力で、メソッドのアクセス許可などを含むこのクラスのプロトタイプを復元することもできます。
アプリケーション シナリオ
1 つはオブジェクトをデバッグすることです。もう 1 つは、クラス情報を取得することです。通常、次のアプリケーション メソッドがあります。
ドキュメント生成では、それを使用してファイル内のクラスをスキャンし、説明ドキュメントを生成します。
MVC およびプラグインでのプラグイン開発開発、リフレクションは一般的に使用されます
欠点
リフレクションによるパフォーマンスの消費も非常に大きいため、通常の状況では、
、は使用しないようにしてください。これは、クラスのカプセル化を破壊します。リフレクションにより、そうでないものが作成される可能性があるためです。公開されるべきメソッドまたはプロパティは、強制的に公開されます。
例
以下は、リフレクション機能を使用して実装された単純なデータベース動的プロキシです。
動的プロキシに基づいて、インターセプターの実装、属性メソッドの追加、トリミングなど、想像力の余地がさらにあります。
class Mysql { function connect($db){ echo "connecting database ${db[0]}\r\n"; } } class SqlProxy { private $target; function __construct($tar){ $this->target[] = new $tar(); } function __call($name, $args){ if($method = $r->getMethod($name)){ if($method->isPublic() && !$method->isAbstract()){ echo "method before record \r\n"; $method->invoke($obj,$args); echo "method after record\r\n"; } } } } } $obj = new SqlProxy('Mysql'); $obj->connect('member');
その他
echo と print はどちらも言語構造ですが、後者には戻り値があります。
print_r と var_dump は複数の種類のデータを出力できる通常の関数ですが、後者はデータ型を出力し、前者の 2 番目のパラメーターは出力を return
推奨事項: "PHP チュートリアル "
に変更できます。以上がPHP リフレクション動的プロキシの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。