こんにちは、Habr!
Mustafa Magdiによる記事「
PHP Reflection APIの紹介 」の翻訳を
紹介します 。
PHPでデータ構造を分析する方法
エントリー
PHPでプログラミングを始めたとき、
Reflection APIの機能について知りませんでした。 主な理由は、単純なクラス、モジュール、さらにはパッケージを設計する必要がなかったからです。 そして、これが多くの分野で大きな役割を果たすことを発見しました。 この記事では、次の点で
Reflection APIを検討し
ます 。
- Reflection APIとは
- インストールと構成
- 使用する
- おわりに
- 推奨事項
1. Reflection APIとは
コンピューターサイエンスでは、 リフレクションまたはリフレクション (イントロスペクションの略語、英語のリフレクション)は、実行時にプログラムが独自の構造と動作を追跡および変更できるプロセスを意味します。 - ウィキペディア 。
停止してコード内を見ることができるということ(
リバースエンジニアリング )とはどういう意味ですか? 次のコードスニペットを見てみましょう。
class Profile { public function getUserName(): string { return 'Foo'; } }
プロファイルクラスはブラックボックスです。
Reflection APIを使用すると、中身を読むことができます。
したがって、
ReflectionClassは
Profileクラスのアナリストとして機能し、これが
Reflection APIの主なアイデアです。
PHPはロックされたボックスのキーを提供するため、キーがあります
次の場合:
ReflectionClass :クラス情報を報告します。
ReflectionFunction :関数情報を報告します。
ReflectionParameter :関数またはメソッドのパラメーターに関する情報を取得します。
ReflectionClassConstant :クラス定数情報を報告します。
php.netで完全なリストを
調べることができます
2.インストールと構成
Reflection APIクラスを使用するには、PHPコアの一部であるため、何もインストールまたは構成する必要はありません。
3.使用例
以下は、
Reflection APIの使用方法の例です。
例1:特定のクラスの親クラスを取得します。
例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));
例4:状況によっては、ユニットテストにこだわる場合があります。「プライベート関数をテストするにはどうすればよいですか!」
心配しないでください、ここにトリックがあります:
前の例は非常に単純ですが、
Reflection APIがより広範囲に使用される方法を確認できる他の例があります。
- APIドキュメントジェネレーター : lavarel-apidoc-generatorパッケージは 、 ReflectionClassとReflrectionMethodを広範囲に使用して、クラスとメソッドのドキュメントブロックに関する情報を取得して処理し、これらのコードブロックをスタイルします。
- Dependency Injection Container : ここでトピック全体を確認できます
4.結論
PHPは、OOP構造のさまざまな領域に簡単に到達するのに役立つ完全な
Reflection APIを提供します。
5.参照
翻訳者から:また、 StubクラスのCodeceptionパッケージでReflection APIを使用する例を見ることができます。
リフレクションによるこのクラスは、単体テストでメソッドとプロパティをディップするのに役立ちます。
Reflection APIの動作はかなり遅いため、あまり深く関与しないようにしてください。 テストまたはデバッグ中に使用することをお勧めしますが、それなしで実行できる場合は、実行することをお勧めします。 また、プロジェクトの作業コードで使用することは明確に推奨されていません。 また、安全ではありません。