PHP类:每次调用方法时都调用特定函数
我想在PHP中每次调用方法时都调用一个函数 例如:PHP类:每次调用方法时都调用特定函数,php,oop,Php,Oop,我想在PHP中每次调用方法时都调用一个函数 例如: $a = new a(); $a->function1(); 这将进行两次函数调用:basicFunction()然后function1() 该类的任何后续方法调用也是如此。这在面向对象的PHP中可能吗?在PHP中没有类似的东西。但是,您可以使用以下命令模拟此行为: 用法: $obj = new YourClass(); $obj->someFunction(); // this calls baseSomeFunction an
$a = new a();
$a->function1();
这将进行两次函数调用:basicFunction()
然后function1()
该类的任何后续方法调用也是如此。这在面向对象的PHP中可能吗?在PHP中没有类似的东西。但是,您可以使用以下命令模拟此行为: 用法:
$obj = new YourClass();
$obj->someFunction(); // this calls baseSomeFunction and executes the code
// in the __call() method
在“magic”方法前面加上
base
这样的前缀可以确保没有人可以调用您的私有函数,并将此访问权限限制为只访问已加前缀的函数。您应该更改此前缀以满足您的需要。当然可以,但它会带来一些开销。magic方法调用将处理不存在的方法,因此您可以执行以下操作:
class myClass {
public function __call($name, $arguments) {
$this->doSomething();
$this->$name($arguments);
}
private function calledmethod() { ... }
然后你会打电话:
$class->calledmethod();
由于方法calledmethod
不是公共的,因此会调用\u调用,然后运行“base”方法,然后calledmethod
我不得不问,你为什么要这样做?如果你描述你试图解决的实际问题,可能会有一个更优雅的解决方案。你必须使用
例如:
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(){}
}
使用
\u调用如下神奇功能:
class a {
private function function1() { ... }
public function __call($name, $args) {
/* do stuff */;
return call_user_func_array(array($this, $name), $args);
}
}
但是请注意,如果从类内部调用function1(),这将不起作用。然后必须重命名function1(),并使用不同的名称调用它。其思想是,只有当函数不存在或无法看到时才会调用\u call
。最简单的方法是只调用该方法
public function function1 {
$this->basicFunction();
// …
}
你可能想要的是这样的东西。然而,这在PHP中并不常见。最显著的用途是在
对于其他可用于PHP OOP的更常见方法,请查看
这将允许您在运行时添加任意行为和控制流
(meta)顺便问一下,我们真的需要四个答案来建议使用\u call
?我建议各老年退休金计划审查各自的答案,找出细微的差异,并就哪一个答案最好达成一致。其他三个可以撤回他们的答案。我认为函数名中的-
无效。这将不会返回函数输出。@难以捉摸:修复,最近js太多,谢谢@cypher:OP从来没有说过任何关于返回值的事情。我想说的是,返回原始被调用函数的值几乎是隐含的,因为他没有说他希望他的函数的任何方法都不会返回值。@Erik:-
在JavaScript的变量名中是允许的吗?我不知道。我知道你可以像这样使用每个字符串:window['some-function-name']()
,但那会有点痛苦,对吧?如果function1()是公共的,就不会使用\uu调用。我现在可以调用每个私有方法。我可以调用这个类的每个私有函数。@elvasive-如果你对此感到困扰,请在\uu调用中加入一些条件。这只是一个建议,而不是生产代码:)不清楚您是否希望在调用function1
时调用basicFunction
,或者调用ctor或调用任何函数时调用basicFunction
。另外,basicFunction
是a
类的一部分吗?请澄清这个问题,也许可以添加一个具体的例子来说明你需要它做什么。
public function function1 {
$this->basicFunction();
// …
}