如何在PHP中获取类的任何方法的输入参数?

时间:2012-05-17 08:56:48

标签: php class methods parameters

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

我想记录所述类的所有方法的输入参数,而不必编辑每个方法来插入该记录代码。那可以吗?

3 个答案:

答案 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',
)

这里有一些注意事项 - 你应该阅读我提供的文档链接 - 一个“限制”是 -

  

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