我希望能够在PHP中每次调用方法时调用一个函数。
例如:
例如:
$a = new a();
$a->function1();
这将会调用两个函数:basicFunction()
和function1()
对于该类的任何后续方法调用,情况都是相同的。在面向对象的PHP中是否可能实现这一点?
在PHP中没有类似这样的功能。但是,您可以使用魔术方法__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
的内容,可以确保没有人能够调用你的私有函数,并将此访问限制仅限于已添加前缀的函数。你应该根据自己的需要更改这个前缀。
_call
可以处理不存在的方法,所以你可以这样做:class myClass {
public function __call($name, $arguments) {
$this->doSomething();
$this->$name($arguments);
}
private function calledmethod() { ... }
然后您将调用:
$class->calledmethod();
由于方法calledmethod
不是公共的,所以调用_call方法会运行您的“基本”方法,然后运行calledmethod
。
我觉得有必要问一下,为什么你需要这样做?如果您描述实际要解决的问题,可能会有更优雅的解决方案。
window['some-function-name']()
,但那会有点麻烦,对吧? - jwueller你必须使用__call魔术方法 以你的例子为例:
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(){}
}
使用__call
魔术方法,像这样:
class a {
private function function1() { ... }
public function __call($name, $args) {
/* do stuff */;
return call_user_func_array(array($this, $name), $args);
}
}
function1
时还是在构造函数被调用时或者在任何函数被调用时调用basicFunction
。此外,basicFunction
是否是a
类的一部分?请澄清问题,并可能添加一个具体的示例来说明您需要这个功能的原因。 - Gordon