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

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

藏色散人
リリース: 2023-04-07 12:52:01
転載
3622 人が閲覧しました

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

リフレクション関連

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

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

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