ホームページ  >  記事  >  バックエンド開発  >  PHPでのリフレクションの詳しい説明とサンプルコード

PHPでのリフレクションの詳しい説明とサンプルコード

高洛峰
高洛峰オリジナル
2016-12-23 12:57:241319ブラウズ

最近『Java Programming Thoughts』を読んでいたところ、型情報に関する章があり、クラス情報とリフレクションの概念について説明されていました。さて、phpのリフレクションツールをおさらいしてみましょう。マニュアルには次のように書かれています: 「PHP 5 には完全なリフレクション API があり、クラス、インターフェイス、関数、メソッド、および拡張機能をリバース エンジニアリングする機能が追加されています。さらに、リフレクション API は、関数、クラス、および拡張機能のリフレクションを取得するメソッドを提供します。メソッド。" ドキュメントのコメント。" もちろん、マニュアルは少し抽象的です。いわゆるリバース エンジニアリングとは、コメントを含むクラス、メソッド、属性、パラメーターなどに関する詳細情報を取得することです。テキストはいつも非常に退屈です。たとえば、

class Foo {
  public  $foo = 1;
  protected $bar = 2;
  private  $baz = 3;
   
  /**
   * Enter description here ...
   */
  public function myMethod()
  {
    echo 'hello 2b';
  }
}
 
$ref = new ReflectionClass('Foo');
$props = $ref->getProperties();
foreach ($props as $value) {
  echo $value->getName()."\n";
}
 
//output
//foo 
//bar
//baz

ReflectionClass このクラスは、特定のクラスに関する関連情報を返します。属性、メソッド、名前空間、それらのインターフェイスの実装などとして。前の例では、ReflectionClass::getProperties は ReflectionProperty オブジェクトの配列を返しました。

ReflectionProperty クラスは、クラスのプロパティに関する情報を報告します。たとえば、isDefault isPrivate isProtected isPublic isStatic など、メソッド getName は属性の名前を取得します。

上記は属性を取得するためのものですが、

class Foo {
  public  $foo = 1;
  protected $bar = 2;
  private  $baz = 3;
   
  /**
   * Enter description here ...
   */
  public function myMethod()
  {
    echo 'hello 2b';
  }
}
 
$ref = new ReflectionClass('Foo');
$method = $ref->getMethod('myMethod');
$method->invoke($ref->newInstance());

ReflectionClass::getMethod などのクラス メソッドを取得するためのメソッドもあります。ReflectionMethod クラスは、isAbstract isPrivate isProtected isPublic isStatic isConstructor などのメソッドに関する情報を報告します。重要なメソッド Invoke と InvokeArgs は実行メソッドです。

他のオブジェクトについては、マニュアルを読むことができます、それは難しくありません!

リフレクションの用途は何ですか?

リフレクションは動的に実行される概念であり、これらを組み合わせて使用​​すると、他のクラス、インターフェイス、メソッド、プロパティ、メソッド、拡張機能の分析に役立ちます。動的プロキシなどのパターンを構築することもできます。 kohana や yii などの一部の PHP フレームワークではリフレクションを使用することも非常に一般的です。以下は、リフレクションを使用する mvc を実装するための kohana のコードです。

// Start validation of the controller
$class = new ReflectionClass(ucfirst(Router::$controller).'_Controller');
// Create a new controller instance
$controller = $class->newInstance();
// Load the controller method
$method = $class->getMethod(Router::$method);
// Execute the controller method
$method->invokeArgs($controller, $arguments);

上記のコードは、このフレームワークのプロセスを明確に見ることができます。 Router を介して、実際に URL クラスを処理して、どのコントローラーとどのメソッドを取得することができます。次に、メソッドを実行します。

上記はPHPリフレクションに関する情報をまとめたものです。今後も関連情報を追加していきますので、どうぞよろしくお願いいたします。

PHP リフレクションの詳細とサンプル コード関連の記事については、PHP 中国語 Web サイトに注目してください。

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