如何知道方法被调用了多少次?

时间:2013-12-15 21:33:34

标签: php oop method-chaining

假设我有这门课。

class foo{
  function a(){
     return $this; 
  }
}

$O = new foo(); 
$O->a()
  ->a()
  ->a();

有没有办法知道,在最后一个函数->a()之前调用了多少次? 所以,我可以像'method ->a() has been called twice before this.'那样输出 我想知道这一点,不使用增量值,如声明一个属性,然后增加它递增它,每次在函数中调用它。

如果OOP中存在可以提供此解决方案的隐藏功能,我只是跳来跳去

1 个答案:

答案 0 :(得分:5)

您可以在方法中使用static variable

class foo{

  function a(){
     // $count will be initialized the first time a() was called
     static $count = 0;
     // counter will be incremented each time the method gets called
     $count ++;

     echo __METHOD__ . " was called $count times\n";
     return $this;
  }
}

请注意,static在方法或函数中使用时具有不同的含义,它与静态类成员无关 - 尽管它是相同的关键字。这意味着只有在第一次调用方法时,才会创建和初始化变量。

但是,在上面的示例中,无法重新初始化该计数器。如果你想这样做,你可能会引入一个参数或类似的东西。你也可以不使用static变量而是使用对象属性。有很多方法可以做到这一点,请告诉我你的确切应用需求我可以给出一个更具体的例子....


在评论中建议使用装饰器来完成这项工作。我喜欢这个想法,并举一个简单的例子:

class FooDecorator
{

    protected $foo;
    protected $numberOfCalls;

    public function __construct($foo) {
        $this->foo = $foo;
        $this->reset();
    }

    public function a() {
        $this->numberOfCalls++;
        $this->foo->a();
        return $this;
    }

    public function resetCounter() {
        $this->numberOfCalls = 0;
    }

    public function getNumberOfCalls() {
        return $this->numberOfCalls;
    }
}

用法示例:

$foo = new FooDecorator(new foo());
$foo->a()
    ->a()
    ->a();

echo "a() was called " . $foo->getNumberOfCalls() . " times\n";