假设我有这门课。
class foo{
function a(){
return $this;
}
}
$O = new foo();
$O->a()
->a()
->a();
有没有办法知道,在最后一个函数->a()
之前调用了多少次?
所以,我可以像'method ->a() has been called twice before this.'
那样输出
我想知道这一点,不使用增量值,如声明一个属性,然后增加它递增它,每次在函数中调用它。
如果OOP中存在可以提供此解决方案的隐藏功能,我只是跳来跳去
答案 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";