如何创建一个每次调用公共方法时都会被调用的方法


How can I create a method that gets called every time a public method gets called?

如何创建一个每次调用公共方法时都会被调用的方法?您也可以说这是一个post方法调用钩子。

我当前的代码:

<?php
class Name {
   public function foo() {
      echo "Foo called'n";
   }
   public function bar() {
      echo "Bar called'n";
   }
   protected function baz() {
      echo "Baz called'n";
   }
}
$name = new Name();
$name->foo();
$name->bar();

此代码中的当前输出为:

Foo called
Bar called

我希望每次调用另一个公共方法时都调用baz()方法。例如

Baz called
Foo called
Baz called
Bar called

我知道我本可以做这样的事情:

public function foo() {
    $this->baz();
    echo "Foo called'n";
}

但这并不能真正解决我的问题,因为这并不是正交的,如果我有100个方法需要在它们之前调用另一个方法,那么实现起来就相对困难。

可能不是你所期望或想要的,但通过使用神奇的方法__call并将这些公共方法标记为protected或private,你可以获得所需的效果:

<?php
class Name {
    public function __call($method, $params) {
        if(!in_array($method, array('foo', 'bar')))
            return;
        $this->baz();
        return call_user_func_array(
                    array($this, $method), $params);
    }
   protected function foo() {
      echo "Foo called'n";
   }
   protected function bar() {
      echo "Bar called'n";
   }
   protected function baz() {
      echo "Baz called'n";
   }
}
$name = new Name();
$name->foo();
$name->bar();