2
A
回答
6
只是裝飾用魔法__call
http://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中實現它。
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
相關問題
- 1. 如何獲取泛型方法參數的類型參數類?
- 2. PHP的 - 任何參數和任何方法取一個值
- 3. 獲取任何輸入類型的值
- 4. 如何獲取任何python方法的參數?
- 5. 如何獲取類在.NET中輸入基類靜態方法?
- 6. 如何獲取方法參數的值?
- 7. 如何處理PHP中沒有任何獲取參數的URL
- 8. 如何獲取選擇器的輸入參數類型?
- 9. 發送任何方法作爲獲取元數據的參數
- 10. 如何將參數發送到url?獲取PHP的方法?
- 11. 如何獲取php方法所需的參數?
- 12. 如何從參數化類型的方法參數中獲取參數化類型的類?
- 13. PHP:獲取方法的參數?
- 14. 如何獲取泛型方法的類型參數?
- 15. 我如何獲取方法參數名
- 16. 如何獲取實例方法參數?
- 17. 如何獲取輸入的類型?
- 18. 獲取當前輸入值參數(PHP)
- 19. 在方法中獲取參數類型
- 20. 如何使用「輸入」方法來獲取函數參數(蟒蛇)
- 21. 如何獲取類方法?
- 22. 如何在Java中調用任何具有任意數量的參數和任何數據類型的方法
- 23. 如何獲取數組中的方法參數?
- 24. 如何使用類中的參數輸出/打印方法?
- 25. 如何使用@Context或類似方法獲取任何類中的ServletRequest?
- 26. 如何獲取TDSAutenticationManager.OnUserAuthorize事件中的命令方法的參數?
- 27. 如何從輸入的數據中獲取行號(sql和php)
- 28. 獲取方法的參數
- 29. 如何匿名方法的輸入參數的數據類型來確定
- 30. 如何從php中獲取參數url?
@戈登:我喜歡你的分開記錄器,虛擬+1刪除答案;-) – zerkms
@zerks謝謝。我試圖編輯你的代碼以使它分開;) – Gordon
感謝你的回答,我決定修改類的方法並添加__call()。 – deathemperor