ホームページ  >  記事  >  バックエンド開発  >  Xin Xing に従って、PHP のリフレクション メカニズムを詳しく調べてください。

Xin Xing に従って、PHP のリフレクション メカニズムを詳しく調べてください。

WBOY
WBOYオリジナル
2016-06-23 13:53:13810ブラウズ

以前 Java を学習していたとき、マルチスレッドを学習した後にリフレクションを学習したことをはっきりと覚えています。まだ理解していない場合は、当然ながら PHP にもリフレクションの仕組みがあります。すべて、反省の機能は依然として非常に強力であり、それを学ぶことは依然として実用的に非常に重要です。 リフレクションを簡単に理解すると、クラスを取得し、そのクラスがどのようなメソッドを持っているか、どのようなパラメータを持っているかなど、このクラスに関する情報を取得できるということです。もちろん、そのメソッドや他の関数、その目的を動的に呼び出すこともできます。プラグインを自動的にロードしたり、ドキュメントを自動生成したりすることで、PHP 言語を拡張できます。

ほぼすべてのリフレクション クラスはリフレクター インターフェイスを実装しています。すべての実装クラスには、このメソッドを使用して情報を表示できます。最初の例として、PHP の組み込みクラスを使用します。リフレクションの基本的な使い方を見てみましょう。次のコードで新しい php ファイルを作成しましょう:

<?php$class = new ReflectionClass("mysqli");Reflection::export($class);

以下は、その部分の出力情報です:

Class [ class mysqli ] { - Constants [0] { } - Static properties [0] { } - Static methods [1] { Method [ static public method poll ] { - Parameters [5] { Parameter #0 [ array or NULL &$read ] Parameter #1 [ array or NULL &$write ] Parameter #2 [ array or NULL &$error ] Parameter #3 [ $sec ] Parameter #4 [ $usec ] } } } - Properties [19] { Property [ public $affected_rows ] Property [ public $client_info ] Property [ public $client_version ] Property [ public $connect_errno ] Property [ public $connect_error ] Property [ public $errno ] Property [ public $error ] Property [ public $error_list ] Property [ public $field_count ] Property [ public $host_info ] Property [ public $info ] Property [ public $insert_id ] 

ここでは、インターセプトした部分のみを示します。コンテンツ全体が非常に長いため、静的メソッドが定義されていないことがわかります。これらの 5 つのパラメーターのうちの最初のパラメーターは次のとおりです。変数 $read で表される配列または配列、2 番目のパラメーターは配列または NULL などです。 。 。 。ここではそれらを 1 つずつ列挙しません。読者は上記のコード スニペットを読んでご自身で判断してください。私たちのコードが何をするかについて話しましょう。まず、ReflectionClass $ クラスのインスタンスを定義して、それを表示します。次に、Reflection の静的メソッド import を呼び出して、このクラスの情報をエクスポートします。上記の情報を参照してください。反用 リフレクション メカニズムを使用して内部クラスに関する情報を表示したので、クラスをカスタマイズしたかどうかを確認できますか。出力情報は次のとおりです。

<?phpclass Person{	public $name;	/**	*仅仅用来打印信息	*/	public function test(){		echo "辛星加油";	}}foreach(get_declared_classes() as $class){	$myclass = new ReflectionClass($class);	if($myclass->isUserDefined()){		Reflection::export($myclass);	}}
そのリフレクション メカニズムを通じて、何が表示されるかたとえば、これは定数を定義しておらず、静的プロパティもありません。$name というパブリック プロパティが 1 つあり、もう 1 つのメソッドは test であり、メソッドのアノテーションは「/**」です。 &*/"。クラスを反映するときに他の人がそれを見ることができるように、適切なアノテーションを書くことの役割をさらに理解できましたか? ここでこの関数の役割を説明します。ちなみに、ここでの get_declared_classes は定義されたクラスを取得するために使用されます。上記の $myclass は文字列ではなくクラスであるため、ユーザーによって isUserDefined が呼び出されているかどうかを検出する独自のメソッドがあることに注意してください。

var_dump を通じてクラスに関する情報を取得できると言う人もいるかもしれません。はい、var_dump を使用して何が出力されるかを見てみましょう:

Class [ class Person ] { @@ D:\MyApp\wamp\www\ap.php 2-10 - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [1] { Property [ public $name ] } - Methods [1] { /** *仅仅用来打印信息 */ Method [ public method test ] { @@ D:\MyApp\wamp\www\ap.php 7 - 9 } } }

出力は次のとおりです:

<?phpclass Person{	public $name;	/**	*仅仅用来打印信息	*/	public function test(){		echo "辛星加油";	}}$person = new Person();$person->name = "xinxing";var_dump($person);

もちろん、誰もが知っているかもしれませんが、リフレクションと比較すると、var_dump はクラスの操作においてまだ非常に弱いです。クラス インスタンスの情報を表示することしかできません。クラスの属性を表示することはできません。これはオブジェクトが持つべきものではありません。

離れないで、私のブログはリフレクションの応用についての記事を書き続けます。少し長いので、別のブログを開きたいと思います。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。