PHP类:每次进行方法调用时调用特定函数

时间:2010-12-13 08:30:19

标签: php oop

每次在PHP中进行方法调用时,我想调用一个函数。

示例:

$a = new a();
$a->function1();

这将进行2次函数调用:basicFunction()然后function1()

该类的任何后续方法调用都是如此。在面向对象的PHP中这是可能的吗?

5 个答案:

答案 0 :(得分:6)

最简单的方法就是调用方法

public function function1 {
    $this->basicFunction();
    // …
}

你可能会追求的是Aspect Oriented Programming之类的东西。但是,这在PHP中并不常见。最值得注意的用途是Flow3 framework

对于可用于PHP OOP的其他更常用的方法,请查看

这些允许您在运行时添加任意行为和控制流。


(meta)在旁注中,我们真的需要四个建议使用__call的答案吗?我建议各个OP审查他们各自的答案,理清微小的差异,并就哪一个最好达成一致。其他三个人可以撤回他们的答案。

答案 1 :(得分:3)

在PHP中没有这样的东西。但是,您可以使用magic method __call()

模拟此行为
class YourClass {
    public function __call($method, $args){
        // do what you want to do everywhere (i.e. call your basicFunction)
        return call_user_func_array(array($this, 'base'.ucfirst($method)), $args);
    }

    private baseSomeFunction() {
        // ...
    }
}

用法:

$obj = new YourClass();
$obj->someFunction(); // this calls baseSomeFunction and executes the code
                      // in the __call() method

使用类似base之类的方法为您的“魔法”方法添加前缀可确保没有人可以调用您的私有函数并将此访问限制为仅限于已加前缀的函数。您应该更改此前缀以满足您的需求。

答案 2 :(得分:3)

当然,虽然它涉及一些开销。魔术方法_call将处理不存在的方法,因此您可以这样做:

class myClass {
    public function __call($name, $arguments) {

        $this->doSomething();
        $this->$name($arguments);
    }

    private function calledmethod() { ... }

然后你会打电话:

$class->calledmethod();

由于方法calledmethod不公开,因此会调用_call,然后运行“基础”方法,然后运行calledmethod

我觉得有必要问,为什么你需要这样做?如果你描述了你想要解决的实际问题,那么可能会有更优雅的解决方案。

答案 3 :(得分:0)

你必须使用__call magic method 以你的例子:

class Foo{
    public function __call($method_name, $arguments){
        $this->basicFunction();
        return call_user_func_array(array($this, $method_name), $arguments);
    }


    private function basicFunction(){}
    protected function function1(){}
}

答案 4 :(得分:0)

使用__call魔法函数,如下所示:

class a {
  private function function1() { ... }
  public function __call($name, $args) {
       /* do stuff */;
       return call_user_func_array(array($this, $name), $args);
  }
}

但是请注意,如果从类内部调用function1(),则无效。然后你必须重命名function1()并用不同的名称调用它。我们的想法是,只有当函数不存在或无法看到时,才会调用__call