【问题标题】:how to get input parameters of any method of a class in PHP?如何在PHP中获取类的任何方法的输入参数?
【发布时间】:2012-05-24 20:15:45
【问题描述】:

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

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

【问题讨论】:

    标签: php class methods parameters


    【解决方案1】:

    只需用魔法装饰器包裹它__callhttp://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 中实现它。

    【讨论】:

    • @Gordon:我喜欢你分开的记录器,对已删除的答案虚拟 +1 ;-)
    • @zerks 谢谢。我也很想编辑您的代码以将其分开;)
    • 感谢解答,我决定修改类的方法,添加__call()。
    【解决方案2】:

    不直接,不。

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

    myFunction() -> _myFunction()
    

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

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

    【讨论】:

    • 自 2013 年起建议不要使用下划线。
    【解决方案3】:

    我可能过于简化了 - 但您可以使用

    检索函数的所有参数
    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',
    )
    

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多