2017-12-05 12 views
5

Go! Aspect-Oriented Framework for PHPPECLエクステンションを必要としないプレーンなPHPのAOP(Go!) - どのように?

と呼ばれるフレームワークがあります。これはプレーンなPHPで作成されており、PECLエクステンションとDIコンテナの動作を必要としません。

これ以上のものは、既存のPHPフレームワークおよびライブラリ(追加構成の有無にかかわらず)と統合することができます。

ポイントカットのランタイムチェック、実行時アノテーション解析、エコーおよび__callメソッド、遅いプロキシおよびcall_user_func_array()はありません。高速ブートストラップ処理(2〜20ms)とアドバイスの呼び出し。

私は非常に感銘を受けましたが、私が知りたいことは、実際にどのように機能するのでしょうか?私はここに記載されている

これらの点は...

私はgithubの公式ウェブサイト、および他のいくつかの記事に見えたが、この作業を行う方法については(一般的には、特定のでは)任意の具体的な情報を見つけることができませんでした。

これはどのように機能するのですか?それはどのように実装されましたか?

答えて

6

このフレームワークは、その仕事を行うために、多くの隠されたトリックを使用しているが、我々は鳥の視点から見れば、そのプロセスは、以下のように説明することができます:AOPエンジンの

  1. 現在のバージョンは、と緊密に連携するように設計されてそれはコンポーザローダを独自のプロキシでラップします。その時点から、AOPはどのクラスをロードすべきか、そのソースコードを探す場所を知っています。
  2. ファイルFoo.phpからいくつかのクラスFooがロードされているとき、AOPは次のよ​​うに特殊なフィルタストリームにラップします:include 'php://filter/read=go.source.transforming.loader/resource=Foo.php';。このストリームフィルタの詳細については、'php://stream' manual
  3. で読むことができます。その時点で、クラスはPHPメモリに読み込まれませんが、フレームワークはすでにそのコンテンツを知っており、ソースコードの分析や変更を行うこともできます。
  4. ソースコードは次いで、トークン化nikic/PHP-Parserライブラリを介してASTに解析し、このコードの静的な反射が生成され(まだPHPのメモリにこのファイルをロードせず)goaop/parser-reflection
  5. エンジンチェックを介して側面からのすべての登録ポイントカットを、元の変換を行いますクラスFoo:名前はFoo__AopProxiedに変更され、クラスFoo extends Foo__AopProxiedの新しいファイルがキャッシュに生成されます。
  6. エンジンは、このクラスを元のクラスではなく新しいファイルから読み込むため、元のクラス名を持ちますが、アドバイスのロジックが追加されています。実行時の自動デコレータ生成のように見えます。

純粋なPHPでのAOPの実装は非常に難しい作業でしたし、実際のソリューションを発見するまでに何度も試したので、ソースコードを掘り起こすのは興味深いことです隠された宝石:)いくつかの情報も私のPhpSerbia talk about cross-cutting concerns in PHPで利用可能です、あなたはそれをより理解のために見ることができます(私の英語には申し訳ありません)。

また、私たちはフレームワークのドキュメントを作成していますので、より良いものにしたい場合は、official documentationにPRを送ってください。

PHPプロジェクトでAOPを使用する開発者に多くの機能を提供するPhpStormプラグインも使用する必要があります。

関連する問題