質問
AOP FOR PHP の概要
解決策
AOPはOOPの後継であり、Aspect Oriented Programmingの略称であり、アスペクト指向プログラミングを意味します。 AOP は、実際には GoF 設計パターンの継続であり、呼び出し元と呼び出し先の間の分離を絶えず追求する設計パターンは、この目標を実現したものであると言えます。実際、このテクノロジーはずっと前に登場しました。ググってみると、すでに2006年に登場した技術だった。
私の理解では、元のメソッドやクラスを破壊せずに関数を水平方向に切断することです。次に、それに対処する独自のメソッドを追加します。たとえば、メソッドを実行する前に権限の判定を行う必要がある場合があります。処理後はログの書き込みなどを行う必要があります。一般的な操作方法はメソッドの先頭と最後に処理手順を記述する方法です。これは、OOP の単一機能の原則を破壊します。なぜなら、同じ処理を実行するメソッドが 100 個、さらには 1000 個もある場合、不要なエラーが発生するのは避けられないからです。これは動作中の AOP です。 。 。
何らかの情報を出力する関数を作成するとき、その情報を表示する権限を持たない人に、処理前にその情報が表示されることは望ましくありません。一部の一般的なキャッシュ情報は、処理後に書き込まれる場合があります。通常の書き方はこんな感じです OneTest{
パブリック関数 getInfo(){
// 権限を確認してください
ACL::checkRole();
//情報を取得するアクション処理を実行します
……
//キャッシュに書き込む
キャッシュ::writeCache();
}
}
コードをコピーします。同じ操作を実行する必要があるメソッドが 1000 個ある場合はどうなるでしょうか。 。 1 か所を変更し、どこでも変更します。メンテナンスが困難な状況が発生します。 AOP を使用してこの問題に対処するには、このクラス OneTest のみが必要です{
パブリック関数 getInfo(){
//情報を取得するアクション処理を実行します
……
}
}
コードをコピーして、カプセル化を破る 2 つを取り出して別の場所に定義します。 。 。 。 。大体そういう意味です。もちろん、誤解は間違いであり、他人を誤解させるのはまったくの偶然です。
詳しい紹介についてはGoogleで検索してください。 。まだ整理されていない情報もあります。 。 。 。 。忙しい合間を縫って作ったものです。
php に関するリンクをいくつか紹介します。興味のある方はぜひ覗いてみてください
PHP の AOP ディスカッション
[url=http://blog.csdn.net/xiaoxiaohai123/archive/2008/06/30/2598377.aspx]リンクタグ http://blog.csdn.net/xiaoxiaohai123/archive/2008/06/30/2598377 .aspx[/url]
PHP 準 AOP 実装
[url=http://hi.baidu.com/ Thinkinginlamp/blog/item/864a0ef46d93b86eddc474f3.html]リンクタグ http://hi.baidu.com/ Thinkinginlamp/blog/item/864a0ef46d93b86eddc474f3.html[/url]
それから私はそれを自分で実装しました
/**
*TSスペクト{
* php用のAOP
* @パッケージ
* @バージョン $id$
* @copyright 2009-2011 SamPeng
* @著者 SamPeng
* @license PHP バージョン 5.2 {@link [url=http://www.sampeng.cn]www.sampeng.cn[/url]}
*/
クラス TSAspect{
/**
*インスタンス
* メソッドが属するオブジェクトへの参照
* @var混合
* @アクセス非公開
*/
プライベート $インスタンス;
/**
*メソッド
*メソッド名
* @var混合
* @アクセス非公開
*/
プライベート $method;
/**
*アスペクト
* スライスの配列を保存
* @var 配列
* @アクセス非公開
*/
プライベート $aspect = array();
/**
* __構築
* コンストラクターはあらゆる側面の実装メソッドを見つけます
* @param 混合 $instance
* @param 混合 $method
* @param 混合 $arg
* @アクセス公開
* @return void
*/
パブリック関数 __construct( $instance,$method,$arg = null ){
$this->aspect = self::findFunction();
$this->instance = $instance;
$this->method = $method;
}
パブリック関数 callAspect(){
$before_arg = $this->beforeFunction();
$callBack = array( $this->インスタンス,$this->メソッド);
$return = call_user_func_array( $callBack,$arg );
$this->afterFunction();
}
/**
*関数前
* メソッドの前に実行されるメソッドのコレクション
* @静的
* @アクセス公開
* @return void
*/
保護された関数 beforeFunction(){
$result = $this->getFunction("before");
$result を返します;
}
/**
*関数後
* メソッドの後に実行されるメソッドのコレクション
* @静的
* @アクセス公開
* @return void
*/
保護された関数 afterFunction(){
$result = $this->getFunction( "after" );
}
/**
*検索関数
* すべてのアスペクト メソッド コレクションを検索します。
* @静的
* @アクセス非公開
* @return void
*/
プライベート静的関数 findFunction(){
$aspect = array();
foreach ( get_declared_classes() as $class ){
$reflectionClass = 新しい ReflectionClass( $class );
if ( $reflectionClass->implementsInterface( 'InterfaceAspect' ) )
$aspect[] = $reflectionClass;
}
$アスペクトを返す;
}
/**
* get関数
* 挿入したメソッドを呼び出します
* @param 混合 $aspect
* @静的
* @アクセス非公開
* @return void
*/
プライベート関数 getFunction($aspect){
$result = array();
$array = $this->アスペクト;
foreach ( $array as $plugin ){
if ( $plugin->hasMethod($aspect ) ){
$reflectionMethod = $plugin->getMethod( $aspect );
if ( $reflectionMethod->isStatic() ){
$items = $reflectionMethod->invoke( null );
}その他{
$pluginInstance = $plugin->newInstance();
$items = $reflectionMethod->invoke( $pluginInstance );
}
//処理经过処理のセット
if ( is_array( $items ) ){
$result = array_merge( $result,$items );
}
}
}
$result を返します;
}
}
インターフェースInterfaceAspect{
パブリック静的関数 getName();
}
クラス testAspect は InterfaceAspect{
を実装します
パブリック静的関数 getName(){
return "これは一测试AOP";
}
パブリック静的関数 before(){
echo "方法実行之前";
}
パブリック静的関数 after(){
echo "方法実行後
";
}
}
クラステスト{
パブリック関数 samTest($arg){
echo "これは 1 つの测试方法です";
}
}
$test = 新しいテスト();
$aspect = new TSAspect($test,'samTest');
$aspect->callAspect();
复制代出射:
方法実行前
これは 1 つの方法です
方法実行之後
ネットワーク友建意:
不懂、、、对开発行アイデア役に立たない?
ネットワーク友建意:
これも一種の設計モードです。 具体的には非常に多くのメソッドが実装されています。 もちろん、PHP は標準 AOP です。時間の経過が横断面処理プロセスに入ります。
ネットワーク友建意:
新しい音はずっと人によって見られていません。
ネットワーク友建意:
昨年就知道面向切面编程了,,,用不上,,,,呵呵,,,
ネットワーク友建意:
刚刚接触面向関数数式编程、Haskell、Erlang
ネットワーク友建意:
PHP は Java よりも必要な AOP が多数あるため、runkit が存在します
ネットワーク友建意:
自己OOPも大きくありません。テクニック。追随しません。