AOP は Aspect Oriented Programming の略語で、次のことを意味します: アスペクト指向プログラミング (アスペクト指向とも呼ばれる)。これを使用すると、プリコンパイルおよびランタイム動的エージェントを通じて、ソース コードを変更せずにプログラムに関数を動的に追加できます。テクノロジー。 AOP は、実際には GoF 設計パターンの継続であり、呼び出し元と呼び出し先の間の分離を絶えず追求する設計パターンは、この目標を実現したものであると言えます。
AOP-PHP は、コンパイルやその他の中間手順を行わずに、PHP でアスペクト指向プログラミングを使用できるようにする PECL 拡張機能です。
AOP 拡張機能の設計は最も単純な方法で、PHP での AOP 実装を考えることができます。
AOP は、横断的な懸念事項 (キャッシュ、ロギング、セキュリティ、トランザクションなど) を分離できるように設計されています
ウェブサイト: http://aop-php.github.io/
2 つのインストール モードがあります:
最初の方法:
2番目の方法:
作成者は 2 番目のインストール方法でエラーを犯しました (エラーがない場合は、ここでスキップできます):
解決策は autoconf を再インストールすることです:
コンパイルとインストールが成功したら、php.ini にモジュールをロードする必要があります。通常、centos では、php モジュールは /etc/php.d にロードされます。次の内容の新しいファイル aop.ini を作成します。
リーリーインストールが成功したら、phpinfo を確認すると、次の内容が表示されます:
aop-php就学前準備
専門用語
アスペクト: 水平方向のアスペクト関係は 1 つのクラスにグループ化されます。
これにより、ほとんどのプロジェクトがこのようにレイアウトされます。
aop_add_beforeに通知
まず機能をテストしましょう
リーリー
リーリー
test.php コード:
リーリー
リーリー
またクラスで遊ぼう
リーリー
リーリー
リーリー
リーリー
リーリー
testaop.php ソースコード
リーリー
test.php ソースコード
リーリー
test.phpを実行
リーリー
復帰後にaop_add_afterに通知
テスト機能
リーリー
testaop.php源码:
<span style="color: #008000;">//</span><span style="color: #008000;">测试返回后通知</span> <span style="color: #800080;">$testpoint22</span> = <span style="color: #0000ff;">function</span><span style="color: #000000;"> () { </span><span style="color: #0000ff;">echo</span> "aop_add_after <br>"<span style="color: #000000;">; }; aop_add_after(</span>'testFunc2()', <span style="color: #800080;">$testpoint22</span>);
test.php源码:
<span style="color: #008000;">//</span><span style="color: #008000;">后通知</span> testFunc2();
执行test.php
这是返回后通知测试:aop_add_after
类和类属性和前通知类似,为了节省篇幅,这里偷懒了。
testfunction.php源码:
<span style="color: #0000ff;">function</span> testFunc3(<span style="color: #800080;">$param1</span>,<span style="color: #800080;">$param2</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$param1</span>. <span style="color: #800080;">$param2</span><span style="color: #000000;">; }</span>
testaop.php源码:
<span style="color: #008000;">//</span><span style="color: #008000;">测试周边通知</span> <span style="color: #0000ff;">function</span> testaround (AopJoinPoint <span style="color: #800080;">$object</span><span style="color: #000000;">) { </span><span style="color: #800080;">$args</span> = <span style="color: #800080;">$object</span>-><span style="color: #000000;">getArguments(); </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$args</span>[0] !== <span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #800080;">$args</span>[0] = '我想测试'<span style="color: #000000;">; } </span><span style="color: #0000ff;">if</span> (<span style="color: #800080;">$args</span>[1] !== <span style="color: #0000ff;">null</span><span style="color: #000000;">) { </span><span style="color: #800080;">$args</span>[1] = '周边通知:'<span style="color: #000000;">; } </span><span style="color: #800080;">$object</span>->setArguments(<span style="color: #800080;">$args</span><span style="color: #000000;">); </span><span style="color: #800080;">$object</span>-><span style="color: #000000;">process(); </span><span style="color: #800080;">$returnValue</span> = <span style="color: #800080;">$object</span>-><span style="color: #000000;">getReturnedValue(); </span><span style="color: #800080;">$returnValue</span> .= 'aop_add_around<br>'<span style="color: #000000;">; </span><span style="color: #800080;">$object</span>->setReturnedValue(<span style="color: #800080;">$returnValue</span><span style="color: #000000;">); } aop_add_around(</span>'testFunc3()', 'testaround');
test.php源码:
<span style="color: #008000;">//</span><span style="color: #008000;">周边通知</span> <span style="color: #0000ff;">echo</span> testFunc3(1,2);
执行test.php
我想测试周边通知:aop_add_around
类和类属性和前通知类似。
除了三个重要函数aop_add_before,aop_add_after,aop_add_around之外,我们还要记住这几个重要的函数。
获取通知的类型。有以下几个默认值。一般用在方法的属性更改。
• AOP_KIND_BEFORE before a given call, may it be function, method or property
• AOP_KIND_BEFORE_METHOD before a method call (method of an object)
• AOP_KIND_BEFORE_FUNCTION before a function call (not a method call)
• AOP_KIND_BEFORE_PROPERTY before a property (read or write)
• AOP_KIND_BEFORE_READ_PROPERTY before a property access (read only)
• AOP_KIND_BEFORE_WRITE_PROPERTY before a property write (write only)
• AOP_KIND_AROUND around a given call, may it be function, method or property access (read / write)
• AOP_KIND_AROUND_METHOD around a method call (method of an object)
• AOP_KIND_AROUND_FUNCTION around a function call (not a method call)
• AOP_KIND_AROUND_PROPERTY around a property (read or write)
• AOP_KIND_AROUND_READ_PROPERTY around a property access (read only)
• AOP_KIND_AROUND_WRITE_PROPERTY around a property write (write only)
• AOP_KIND_AFTER after a given call, may it be function, method or property access (read / write)
• AOP_KIND_AFTER_METHOD after a method call (method of an object)
• AOP_KIND_AFTER_FUNCTION after a function call (not a method call)
• AOP_KIND_AFTER_PROPERTY after a property (read or write)
• AOP_KIND_AFTER_READ_PROPERTY after a property access (read only)
• AOP_KIND_AFTER_WRITE_PROPERTY after a property write (write only)
获取方法的参数。一般用在aop_add_before/aop_add_around。
设置方法的参数。一般用在aop_add_before/aop_add_around。
获取方法的返回值。一般用在aop_add_after/aop_add_around。
设置方法的返回值。一般用在aop_add_after/aop_add_around。
让方法运行。一般用在aop_add_around。
具体详细说明,请参考官方文档。
新建一个文件aopopenclose.php
源码如下:
<span style="color: #000000;">php </span><span style="color: #008080;">ini_set</span>("aop.enable", "1"<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> "aop is enabled<br>"<span style="color: #000000;">; </span><span style="color: #0000ff;">function</span><span style="color: #000000;"> foo () { </span><span style="color: #0000ff;">echo</span> "I'm foo<br>"<span style="color: #000000;">; } </span><span style="color: #800080;">$adviceShowFoo</span> = <span style="color: #0000ff;">function</span><span style="color: #000000;"> () { </span><span style="color: #0000ff;">echo</span> "After foo<br>"<span style="color: #000000;">; }; aop_add_after(</span>'foo()', <span style="color: #800080;">$adviceShowFoo</span><span style="color: #000000;">); foo(); </span><span style="color: #008080;">ini_set</span>('aop.enable', '0'<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> "aop is now disabled<br>"<span style="color: #000000;">; foo(); </span><span style="color: #0000ff;">echo</span> "But you can still register new aspects<br>"<span style="color: #000000;">; aop_add_after(</span>'f*()', <span style="color: #800080;">$adviceShowFoo</span><span style="color: #000000;">); foo(); </span><span style="color: #008080;">ini_set</span>('aop.enable', '1'<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> "Aop is now enabled<br>"<span style="color: #000000;">; foo();</span>
运行结果:
aop is enabled I'm foo After foo aop is now disabled I'm foo After foo But you can still register new aspects I'm foo After foo After foo Aop is now enabled I'm foo After foo After foo
aop-php在真实意义上实现了php的aop,用户无需用其他的方式即可轻松实现。aop的编程思想是一把利刃,可以让耦合性差的项目轻松实现解耦。
全部测试文件和编辑后文件打包。点此下载。(基于ceotos环境php5.3编译)