【问题标题】:Log class function calls php日志类函数调用php
【发布时间】:2014-10-21 10:49:12
【问题描述】:

我正在开发一个现有类的包装函数。

<?php 
    class wrapper extends client {
        public function __call($name,$args) {
            var_dump($name);
            var_dump($args);
        }
    }

    $client = new wrapper();
    $client->users()->foobar();
?>

我的回答是:

    string(5) "users"
    array(0) {
    }
      

我的目标是记录调用了哪个函数以及参数。

我怎样才能看到用户类上的函数 foobar() 被调用了。而不仅仅是“用户”?有没有合适的方法来做到这一点?

【问题讨论】:

    标签: php class oop extends


    【解决方案1】:

    您要做的是实现 Decorator 模式,而不仅仅是扩展类。这很容易,因为我们拥有您已经使用过的那些神奇方法。但是您错过了包装类中的两个重要部分:

    • 实例化包装的子类
    • 对子类的中继函数调用

    您的扩展将不起作用,因为只有在类没有具有给定名称的方法时才会调用神奇的 __call 方法。所以你需要没有这些方法的 Wrapper Decorator 类。

    示例:

    class BetterWrapper {
        protected $child;
    
        public function __construct(){
            $this->child = new Client();
        }
    
        public function __call($name,$args) {
            var_dump($name);
            var_dump($args);
    
            return call_user_func_array(array($this->child, $name), $args);
        }
    }
    

    试试这个吧。

    请参阅此文档了解 __call 方法的机制:http://php.net/manual/en/language.oop5.overloading.php#object.call

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 2013-06-19
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 2016-02-21
      • 1970-01-01
      相关资源
      最近更新 更多