假设我有一个包含10个方法的类,每个方法都有不同的参数。
我想记录所述类的所有方法的输入参数,而不必编辑每个方法来插入该记录代码。那可以吗?
答案 0 :(得分: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 :(得分:3)
不直接,没有。
您可以将所有方法重命名为具有下划线后缀,例如:
myFunction() -> _myFunction()
然后,写入添加魔术__call()
方法来拦截对先前(未加前缀)方法的调用。然后,您将记录请求并将所有参数传递给原始方法。
这有点难看,但仍需要更改所有方法名称。
答案 2 :(得分: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',
)
这里有一些注意事项 - 你应该阅读我提供的文档链接 - 一个“限制”是 -
注意:强>
此函数仅返回传递的参数的副本,并不考虑默认(未传递)参数。