PHPAOP面向切面

lin.tao發表於2016-07-14
  • 如果一個程式是一個管道系統,AOP 就是在管道上鑽一些孔,在每個孔中注入新的程式碼流。
  • AOP 的實施分 3 步:切面分解、切面實現和切面合成。
  • OOP 只能沿繼承樹的縱向方向重用,AOP 可以沿橫向方向重用。

AOP 面向切面程式設計 轉載地址

  • 物件導向關注於每個物件定義的完整性
  • 切面是關注於整個物件系統的某個/某些特定功能面,比如日誌、過濾等,把這些特定功能面剝離出來達到共用的目的

User.php

<?php

class User {
    private $name;

    function set_name($value) {
        $this->name = $value;
    }

    function get_name() {
        return $this->name;
    }
}

#$c1 = new User();
#$c1->set_name("Colin");
#$name = $c1->get_name();
#echo "name = ", $name, "
";

?>

現在如果想在使用者名稱字設定或讀取的時候記錄日誌,該怎麼做?
你可以建立一個動態的日誌處理物件,把這個使用者物件包裝在其中,這樣看起來使用者物件的動作都會通知到其包裝日誌類一樣

Logged.php

<?php

require_once(__dir__ . "/User.php");

class Logged {
    private $obj;

    function __call($method, $args) {
        echo $method, "(", join(",", $args), ")
";
        return call_user_func_array(array(&$this->obj, $method), $args);
    }

    function __construct($obj) {
        $this->obj = $obj;
    }
}

$c1 = new Logged(new User());
$c1->set_name("Colin");
$name = $c1->get_name();
echo "name = ", $name, "
";

?>

Output

set_name(Colin)
get_name()
name = Colin

呼叫程式碼還是一樣,但這一次,任何對User方法的訪問,都會被echo出來(你可以把echo替換其他的邏輯,如安全控制、日誌記錄、資料過濾等)

就好比在User物件的方法被呼叫時被某個鉤子函式給掛載了,進行了預處理後置處理


相關文章