假设我有一个包含 10 个方法的类,每个方法都有不同的参数。
我想记录所述类的所有方法的输入参数,而不必编辑每个方法来插入该记录代码。有没有办法做到这一点 ?
假设我有一个包含 10 个方法的类,每个方法都有不同的参数。
我想记录所述类的所有方法的输入参数,而不必编辑每个方法来插入该记录代码。有没有办法做到这一点 ?
只需用魔法装饰器包裹它__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 中实现它。
不直接,不。
您可以将所有方法重命名为具有下划线后缀,例如:
myFunction() -> _myFunction()
然后,编写添加魔术__call()
方法来拦截对先前(无前缀)方法的调用。然后,您将记录请求并将所有参数传递给原始方法。
这有点难看,仍然需要更改所有方法名称。
我可能过度简化了这一点 - 但您可以使用检索函数的所有参数
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',
)
这里要添加一些注释-您应该阅读我提供的文档链接-一个“限制”是-
注意:
此函数仅返回传递参数的副本,不考虑默认(未传递)参数。