PHP語言動態特性-面向切面

來源:互聯網
上載者:User
PHP語言動態特性的更多用例

下面的例子類似面向切面編程,其和物件導向不同的地方在於,物件導向關注於每個對象定義的完整性,

而切面是關注於整個對象系統的某個/某些特定功能面,比如日誌、過濾等,把這些特定功能面剝離出來達到共用的目的。

Listing 8. 簡單的User類

<?phpclass User{  private $name;  function set_name( $value )  {    $this->name = $value;  }  function get_name()  {    return $this->name;  }}$c1 = new User();$c1->set_name( "Jack" );$name = $c1->get_name();echo( "name = $name\n" );?>

這個對象足夠簡單,現在如果想在使用者名稱字設定或讀取的時候記錄日誌,該怎麼做?

你可以建立一個動態Tlog對象,把這個使用者物件封裝在其中,這樣看起來使用者物件的動作都會通知到其封裝日誌類一樣。

Listing 9. 動態封裝類

<?phpclass Logged{  private $obj;  function __call( $method, $args )  {    echo( "$method( ".join( ",", $args )." )\n" );    return call_user_func_array(array(&$this->obj,$method), $args );  }  function __construct( $obj )  {    $this->obj = $obj;  }}$c1 = new Logged( new User() );$c1->set_name( "Jack" );$name = $c1->get_name();echo( "name = $name\n" );?>

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

就好比在User對象的方法被調用時被某個鉤子函數給掛載了,進行了預先處理或後置處理。

by iefreer

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.