2

假设我有一个包含 10 个方法的类,每个方法都有不同的参数。

我想记录所述类的所有方法的输入参数,而不必编辑每个方法来插入该记录代码。有没有办法做到这一点 ?

4

3 回答 3

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 中实现它。

于 2012-05-17T09:06:42.030 回答
3

不直接,不。

您可以将所有方法重命名为具有下划线后缀,例如:

myFunction() -> _myFunction()

然后,编写添加魔术__call()方法来拦截对先前(无前缀)方法的调用。然后,您将记录请求并将所有参数传递给原始方法。

这有点难看,仍然需要更改所有方法名称。

于 2012-05-17T09:01:47.243 回答
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',
)

这里要添加一些注释-您应该阅读我提供的文档链接-一个“限制”是-

注意:
此函数仅返回传递参数的副本,不考虑默认(未传递)参数。

于 2012-05-17T09:01:41.487 回答