ホームページ > バックエンド開発 > PHPチュートリアル > Xin Xing が PHP のリフレクション メカニズムを詳しく調べてみましょう

Xin Xing が PHP のリフレクション メカニズムを詳しく調べてみましょう

WBOY
リリース: 2016-06-13 12:02:54
オリジナル
1039 人が閲覧しました

Xin Xing に従って、PHP のリフレクション メカニズムについて詳しく説明します

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

ほとんどすべてのリフレクション クラスはリフレクター インターフェイスを実装しています。すべての実装クラスには、エクスポート メソッドというメソッドが 1 つあります。ここでは、最初の 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 ] 
ログイン後にコピー

コンテンツ全体がまだ非常に長いため、静的メソッドが定義されていないことがわかります。メソッド名は、poll です。5 つのパラメータが必要です。これら 5 つのパラメータのうちの最初のパラメータは、変数 $read で表される配列または NULL です。 。 。 。ここではそれらを 1 つずつ列挙しません。読者は上記のコード スニペットを読んでご自身で判断してください。

コードの動作について説明します。まず、リフレクション クラス ReflectionClass $class のインスタンスを定義します。ここでは情報を貼り付けません。読者が行ったことを参照してください。それ自体を呼び出してから、Reflection の静的メソッド export を呼び出してこのクラスの情報をエクスポートすると、上記の情報が表示されます。

上記では、組み込みクラスの情報を表示するためにリフレクション メカニズムを使用しました。次のコードのように、カスタム クラスの情報を表示できますか? 答えは明らかに「はい」です。 🎜 >

次に、上記のコードを実行すると、出力情報が次のとおりであることがわかります。

<?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 という public 属性と 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 はクラスに適しています。この操作はまだ非常に弱いですが、クラスのインスタンスの情報を表示することしかできず、クラスのアノテーションやメソッドについては何もできません。方法はありません。これはオブジェクトが持つべきものではありません。
<strong>object</strong>(<em>Person</em>)[<em>1</em>]  <em>public</em> 'name' <span style="color:#888a85">=></span> <small>string</small> <span style="color:#cc0000">'xinxing'</span> <em>(length=7)</em>
ログイン後にコピー

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



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