PHP Reflection APIの概要

こんにちは、Habr! Mustafa Magdiによる記事「 PHP Reflection APIの紹介 」の翻訳を紹介します



PHPでデータ構造を分析する方法







エントリー



PHPでプログラミングを始めたとき、 Reflection APIの機能について知りませんでした。 主な理由は、単純なクラス、モジュール、さらにはパッケージを設計する必要がなかったからです。 そして、これが多くの分野で大きな役割を果たすことを発見しました。 この記事では、次の点でReflection APIを検討します



  1. Reflection APIとは
  2. インストールと構成
  3. 使用する
  4. おわりに
  5. 推奨事項




1. Reflection APIとは



コンピューターサイエンスでは、 リフレクションまたはリフレクション (イントロスペクションの略語、英語のリフレクション)は、実行時にプログラムが独自の構造と動作を追跡および変更できるプロセスを意味します。 - ウィキペディア
停止してコード内を見ることができるということ( リバースエンジニアリング )とはどういう意味ですか? 次のコードスニペットを見てみましょう。



/** * Class Profile */ class Profile { /** * @return string */ public function getUserName(): string { return 'Foo'; } }
      
      





プロファイルクラスはブラックボックスです。 Reflection APIを使用すると、中身を読むことができます。



 //  $reflectionClass = new ReflectionClass('Profile'); //    var_dump($reflectionClass->getName()); => output: string(7) "Profile" //    var_dump($reflectionClass->getDocComment()); => output: string(24) "/** * Class Profile */"
      
      





したがって、 ReflectionClassProfileクラスのアナリストとして機能し、これがReflection APIの主なアイデアです。



PHPはロックされたボックスのキーを提供するため、キーがあります

次の場合:

ReflectionClass :クラス情報を報告します。

ReflectionFunction :関数情報を報告します。

ReflectionParameter :関数またはメソッドのパラメーターに関する情報を取得します。

ReflectionClassConstant :クラス定数情報を報告します。



php.netで完全なリストを調べることができます



2.インストールと構成



Reflection APIクラスを使用するには、PHPコアの一部であるため、何もインストールまたは構成する必要はありません。



3.使用例



以下は、 Reflection APIの使用方法の例です。



例1:

特定のクラスの親クラスを取得します。



 //   class Child extends Profile { } $class = new ReflectionClass('Child'); //     print_r($class->getParentClass()); // ['Profile']
      
      





例2:

getUserName()



メソッドのドキュメントを取得します。



 $method = new ReflectionMethod('Profile', 'getUserName'); var_dump($method->getDocComment()); => output: string(33) "/** * @return string */"
      
      





例3:

instanceOf



およびis_a()



として使用して、オブジェクトを検証できます。



 $class = new ReflectionClass('Profile'); $obj = new Profile(); var_dump($class->isInstance($obj)); // bool(true) //    var_dump(is_a($obj, 'Profile')); // bool(true) //    var_dump($obj instanceof Profile); // bool(true)
      
      





例4:

状況によっては、ユニットテストにこだわる場合があります。「プライベート関数をテストするにはどうすればよいですか!」



心配しないでください、ここにトリックがあります:



 //    getName() private function getName(): string { return 'Foo'; } $method = new ReflectionMethod('Profile', 'getUserName'); //          if ($method->isPrivate()) { $method->setAccessible(true); } echo $method->invoke(new Profile()); // Foo
      
      





前の例は非常に単純ですが、 Reflection APIがより広範囲に使用される方法を確認できる他の例があります。

  • APIドキュメントジェネレーターlavarel-apidoc-generatorパッケージReflectionClassReflrectionMethodを広範囲に使用して、クラスとメソッドのドキュメントブロックに関する情報を取得して処理し、これらのコードブロックをスタイルします。
  • Dependency Injection Containerここでトピック全体を確認できます


4.結論



PHPは、OOP構造のさまざまな領域に簡単に到達するのに役立つ完全なReflection APIを提供します。



5.参照





翻訳者から:



また、 StubクラスのCodeceptionパッケージでReflection APIを使用する例を見ることができます。

リフレクションによるこのクラスは、単体テストでメソッドとプロパティをディップするのに役立ちます。



Reflection APIの動作はかなり遅いため、あまり深く関与しないようにしてください。 テストまたはデバッグ中に使用することをお勧めしますが、それなしで実行できる場合は、実行することをお勧めします。 また、プロジェクトの作業コードで使用することは明確に推奨されていません。 また、安全ではありません。



All Articles