ホームページ >バックエンド開発 >PHPチュートリアル >PHP リフレクション動的プロキシ

PHP リフレクション動的プロキシ

藏色散人
藏色散人転載
2019-09-23 09:14:093647ブラウズ

リフレクションはクラスの内部構造を検出でき、プラグイン関数を実装するためのフックとして、または動的プロキシとして使用できます。

リフレクション関連

クラスおよびオブジェクトに関連する関数

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 サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。