ホームページ  >  記事  >  php教程  >  php aopの練習

php aopの練習

WBOY
WBOYオリジナル
2016-07-09 09:10:011540ブラウズ

aop紹介

AOP は Aspect Oriented Programming の略語で、次のことを意味します: アスペクト指向プログラミング (アスペクト指向とも呼ばれる)。これを使用すると、プリコンパイルおよびランタイム動的エージェントを通じて、ソース コードを変更せずにプログラムに関数を動的に追加できます。テクノロジー。 AOP は、実際には GoF 設計パターンの継続であり、呼び出し元と呼び出し先の間の分離を絶えず追求する設計パターンは、この目標を実現したものであると言えます。

aop-phpの紹介

AOP-PHP は、コンパイルやその他の中間手順を行わずに、PHP でアスペクト指向プログラミングを使用できるようにする PECL 拡張機能です。

AOP 拡張機能の設計は最も単純な方法で、PHP での AOP 実装を考えることができます。

AOP は、横断的な懸念事項 (キャッシュ、ロギング、セキュリティ、トランザクションなど) を分離できるように設計されています

ウェブサイト: http://aop-php.github.io/

aop-phpのインストール

インストール

2 つのインストール モードがあります:

最初の方法:

リーリー

2番目の方法:

リーリー
./configure --with-aop --with-php-config=/usr/bin/php-config
リーリー

エラー処理

作成者は 2 番目のインストール方法でエラーを犯しました (エラーがない場合は、ここでスキップできます):

リーリー

解決策は autoconf を再インストールすることです:

リーリー

コンパイルとインストールが成功したら、php.ini にモジュールをロードする必要があります。通常、centos では、php モジュールは /etc/php.d にロードされます。次の内容の新しいファイル aop.ini を作成します。

リーリー

インストールが成功したら、phpinfo を確認すると、次の内容が表示されます:

aop-php就学前準備

専門用語

練習する前に、Haaop の専門用語をいくつか学ぶ必要があります。

アスペクト: 水平方向のアスペクト関係は 1 つのクラスにグループ化されます。
アドバイス (通知): アスペクトを呼び出し、特定の状況下で何をすべきか、いつ行うべきかを定義するために使用されます。通知は、事前通知、復帰後通知、投げ後通知、周囲通知に分かれています。
結合ポイント: 通知が作成される場所。
ポイントカット: 通知を特定のアクセス ポイントに一致させる方法を定義します。
詳細については、このブログを参照してください: http://www.cnblogs.com/baochuan/archive/2012/08/22/2644529.html
参考ドキュメント

この知識を理解した後、aop-php ドキュメントもダウンロードする必要があります。公式ドキュメントのダウンロード
それでは、適切な電子テキストをお持ちの場合は、公式ドキュメントを読んで、下のテキストに直接スキップしてください。
書類を準備する

練習の前に、テスト関数ファイル testfunction.php、テストクラスファイル testclass.php、テスト aop ファイル testaop.php、実行ファイル test.php の 4 つのファイルを準備する必要があります。

これにより、ほとんどのプロジェクトがこのようにレイアウトされます。

aop-php練習のお知らせ

aop_add_beforeに通知

コード内のいくつかの特別なポイントの前に使用される通知は、通常、メソッドまたは関数を呼び出します。

まず機能をテストしましょう

testfunction.php コード:

リーリー
testaop.php コード:

リーリー

test.php コード:

リーリー
当然のことながら、test.php を実行すると、次のことが表示されます:

リーリー

またクラスで遊ぼう

testclass.php コード:

リーリー
testaop.php コード:

リーリー
test.php コード:

リーリー
test.phpを実行

リーリー
クラス属性を再度テストします

testclass.php ソースコード

リーリー

testaop.php ソースコード

リーリー

test.php ソースコード

リーリー

test.phpを実行

リーリー

復帰後にaop_add_afterに通知

コード内のいくつかの特別なポイントの後に、通常はメソッドまたは関数を呼び出すことによって使用される通知。

テスト機能

testfunction.php ソースコード:

リーリー

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

  

类和类属性和前通知类似,为了节省篇幅,这里偷懒了。

 

周边通知aop_add_around 

测试函数

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-php函数说明

除了三个重要函数aop_add_before,aop_add_after,aop_add_around之外,我们还要记住这几个重要的函数。

getKindOfAdvice

获取通知的类型。有以下几个默认值。一般用在方法的属性更改。

• 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)

getArguments

获取方法的参数。一般用在aop_add_before/aop_add_around。

setArguments

设置方法的参数。一般用在aop_add_before/aop_add_around。

getReturnedValue

获取方法的返回值。一般用在aop_add_after/aop_add_around。

setReturnedValue

设置方法的返回值。一般用在aop_add_after/aop_add_around。

process

让方法运行。一般用在aop_add_around。

 

具体详细说明,请参考官方文档。

 

aop-php开启和关闭

新建一个文件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总结

aop-php在真实意义上实现了php的aop,用户无需用其他的方式即可轻松实现。aop的编程思想是一把利刃,可以让耦合性差的项目轻松实现解耦。

全部测试文件和编辑后文件打包。点此下载。(基于ceotos环境php5.3编译)

 

 

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