Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何创建一个每次调用公共方法时都被调用的方法?_Php_Oop - Fatal编程技术网

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

Php 如何创建一个每次调用公共方法时都被调用的方法?,php,oop,Php,Oop,如何创建一个每次调用公共方法时都被调用的方法?您也可以说这是一个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";

如何创建一个每次调用公共方法时都被调用的方法?您也可以说这是一个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();
我希望每次调用另一个公共方法时都调用baz()方法。例如

Baz called
Foo called
Baz called
Bar called
我知道我本可以做这样的事情:

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

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

可能不是你所期望的或想要的,但是,通过使用magic方法
\u 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();

如果不想更改现有方法的可见性,可以改为创建一个装饰器。我使用了
If($method=='baz'| |!method_exists($this,$method))return在#4。谢谢,我没有想到调用()方法!
<?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();