PHPはAOPの雛形を実現する(PHPのAOPを簡単な例で理解する)

5026 ワード

AOPはOOPの継続であり、Aspect Oriented Programmingの略で、側面向けプログラミングを意味し、断面向けプログラミングとも呼ばれるものもある.エンタープライズ開発では、プログラミングの面で役立ちます.たとえば、特定のメソッドを呼び出す前に、ログを記録する必要があります.メソッドを呼び出すと、ログを記録する必要があります.まずAOPを使用しないでPHPでどのように実現するかを見てみましょう.

/**
 *    
 */
class SystemLog {
    function beforeLog() {
        // write before log
    }
    
    function afterLog() {
        // write after log
    }
}

/**
 *    
 */
class News extends SystemLog {
    function add() {
        $this->beforeLog();
        // add news
        $this->afterLog();
    }

    function delete() {
        // delete news
    }
}

メソッド呼び出し前と呼び出し後のログを記録するための2つのメソッドbeforeLog()とafterLog()を含むログクラスを定義し、次に、メソッド呼び出し前と呼び出し後のログクラスを定義します.次に、add()メソッドを呼び出す前後にログ記録を完了するには、add()メソッド内でbeforeLog()とafterLog()の2つのメソッドしか呼び出されません.add()メソッドを呼び出す前/後にログを記録することを実現したが,このようなコードはOOPプログラミングにおいて少しも優雅ではなく,「弱結合,強集約」の考え方にも反する.Newsクラスのadd()メソッドはニュースを追加すべきことをするだけであり,add()メソッドにおいてまたログを記録したからである.また、多くの方法にログ記録機能を追加する必要がある場合は、beforeLog()メソッドとafterLog()メソッドが複数回呼び出され、多くの重複コードがもたらされます.
PHP 5では、未定義のメソッドを呼び出すと自動的に__が呼び出されるcall()メソッド.PHP 5のこの特徴を利用して、私たちは_call()メソッドではAOPプログラミングが実現され,このAOPプログラミングはAOPの雛形にすぎず,Javaほど強くはない.

/**
 *    
 */
class SystemLog {
    function _call($method,$args) {
        $method = "_$method"; //           ‘_’,$method        
        // write before log
        $return = call_user_func_array(array($this, $method), $args);
        // write after log 
        return $return;
    } 
}

/**
 *    
 */
class News extends SystemLog {
    function _add() {
        // add news
    }

    function delete() {
        // delete news
    }
}

ニュースクラスか継承ログクラスか、add()メソッドの前に''を追加したことに注意してください.add()メソッドには、ログに関連するコードはありません.
$news = new News();
$news->add();

Newsクラスのadd()メソッドを呼び出します.書き換えたNewsクラスにはadd()メソッドはありません.add()メソッド、この場合PHPでadd()メソッドが見つからないと自動的に呼び出されます_call()メソッド,call()メソッドには2つのパラメータがあり、1つ目のパラメータは呼び出されたメソッドの名前であり、2つ目のパラメータは呼び出されたメソッドのパラメータであり、_call()メソッドでは、まず呼び出されたメソッド名に''を追加し、ここで、''を追加後の方法は後になって_add,_add()メソッドはNewsクラスに存在し、メソッド呼び出し前ログを書き込み、call_を使用します.user_func_array()関数は、前オブジェクトメソッド呼び出しを実行し、メソッド呼び出しが完了した後のログを書き換える.
振り返ると、プログラミング慣例とPHP 5で定義されていないメソッドを呼び出すと自動的に呼び出されます.call()メソッドの特性は、AOPを実現していますが、ここのAOPはまだ雛形で、機能がまだ強くなく、PHPの発展に伴い、将来のPHPもAOPの面でもっと強くなると信じています.