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