2012-05-17 41 views

回答

6

只是裝飾用魔法__callhttp://ideone.com/n9ZUD

class TargetClass 
{ 
    public function A($a, $b) {} 
    public function B($c, $d) {} 
    public function C($e, $f) {} 
} 

class LoggingDecorator 
{ 
    private $_target; 

    public function __construct($target) 
    { 
     $this->_target = $target; 
    } 

    public function __call($name, $params) 
    { 
     $this->_log($name, $params); 

     return call_user_func_array(array($this->_target, $name), $params); 
    } 

    private function _log($name, $params) 
    { 
     echo $name . ' has been called with params: ' . implode(', ', $params) . '<br>'; 
    } 
} 

$target = new TargetClass(); 
$logger = new LoggingDecorator($target); 

$logger->A(1, 2); 
$logger->A(3, 4); 

這種方法的唯一缺點包裹它,你就失去了裝飾類,如種類你將無法使用它來滿足類型提示。如果這是一個問題,提取TargetClass的接口並在LoggingDecorator中實現它。

+0

@戈登:我喜歡你的分開記錄器,虛擬+1刪除答案;-) – zerkms

+1

@zerks謝謝。我試圖編輯你的代碼以使它分開;) – Gordon

+0

感謝你的回答,我決定修改類的方法並添加__call()。 – deathemperor

1

我可能過於簡化這一點 - 但你可以使用

func_get_args(); 

返回一個數組包含一個函數的參數列表
http://www.php.net/manual/en/function.func-get-args.php

<?php 
    function foo() { 
    $args = func_get_args(); 
    var_export($args); 
    } 
    foo('arg1', 'arg1'); 
?> 
檢索功能的所有參數

這會輸出這樣的東西 -

array (
    0 => 'arg1', 
    1 => 'arg2', 
) 

有在這裏增加了幾個音符 - 你應該閱讀我所提供的文件鏈接 - 一個「限制」是 -

注:
該函數返回僅傳遞參數的副本,並且不包含默認(未傳遞)參數。

3

不直接,沒有。

你可以重新命名所有的方法有下劃線的後綴,例如:

myFunction() -> _myFunction() 

然後,寫加魔法__call()方法攔截到以前的(沒有前綴)方法的調用。然後您將記錄請求並將所有參數傳遞給原始方法。

這是一種醜陋,仍然需要改變所有的方法名稱。

+0

下劃線建議不要在2013以來使用。 – andersfylling

相關問題