【问题标题】:Get the number of time a class method has been invoked?获取类方法被调用的次数?
【发布时间】:2013-12-15 21:33:34
【问题描述】:

假设我有这门课。

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

我将其实例化为:

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

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

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

【问题讨论】:

  • 增量属性有什么问题? AFAIK 在 任何 OO 语言中都没有这样的“隐藏功能”。
  • 你为什么不想增加一个计数器?为什么会有隐藏功能呢?
  • 我的意思是,我不够熟练,不知道 OOP 是否真的支持这个功能。
  • 这与一般的 OOP 有什么关系?如果您可以神奇地跟踪调用方法或函数的频率,那将是一种语言功能。它与 OOP 并没有真正的关系,对于函数式编程或过程式编程,可能会问同样的问题。只需为它实现一个计数器...

标签: php oop method-chaining


【解决方案1】:

您可以在方法内使用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 变量,而是使用对象属性。有很多方法可以做到这一点,请告诉我您的确切应用程序需求,我可以举一个更具体的例子....


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

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";

【讨论】:

  • 不确定为什么是 -1,它是对一个坏问题的有效答案。
  • 谢谢,但是当我说增量时,这是我想要避免的。但是,如果没有找到其他替代品,那么我想我将不得不使用这个。
  • @ANW 检查我的更新。有1000种方法可以做。告诉我你到底想实现什么,我可以提供更多帮助
  • @OneOfOne 也许是因为它没有准确回答问题。对象属性可能是更好的方法。否则多个对象可能会相互影响
  • 或者你可以装饰原始对象,也不返回this,而是对象的装饰视图......这真的取决于你想要做什么。
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2011-10-28
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多