Php 如何在调用类的成员函数时自动调用函数?
在php中,在调用类的成员函数时,有没有可能自动调用新函数 例如:我编写了一个包含4个成员函数的类。 然后我为这个类创建了对象。 现在,我将根据需要调用任何一个函数。 当我调用该类的任何一个函数时。我需要做一些设置/逻辑,我该怎么做 注意:我不愿意在定义的函数中调用新函数,也不需要为所有定义的函数编写逻辑。我正在寻找任何神奇的方法。请告诉我Php 如何在调用类的成员函数时自动调用函数?,php,codeigniter,oop,zend-framework,Php,Codeigniter,Oop,Zend Framework,在php中,在调用类的成员函数时,有没有可能自动调用新函数 例如:我编写了一个包含4个成员函数的类。 然后我为这个类创建了对象。 现在,我将根据需要调用任何一个函数。 当我调用该类的任何一个函数时。我需要做一些设置/逻辑,我该怎么做 注意:我不愿意在定义的函数中调用新函数,也不需要为所有定义的函数编写逻辑。我正在寻找任何神奇的方法。请告诉我 Class IMAP{ Function IMAP() { Do something } Function getfolders() { Do some
Class IMAP{
Function IMAP()
{
Do something
}
Function getfolders() {
Do something
}
Function appendmessage()
{
Do something
}
//I need to call the below function whenever I am going to call any one of the function
Function checktokenexpired()
{
}
}
这个类包含很多函数,我不可能在所有函数中添加这个函数。你应该看看PHP魔法函数,它允许你实现方法重载。如果你不想,你可以从一个小包装开始,如下所示:
class AOP
{
function __construct($base, $methods) {
$this->base = $base;
$this->methods = $methods;
}
function __call($name, $args) {
$this->methods["before_$name"]($args);
$ret = call_user_func_array([$this->base, $name], $args);
$this->methods["after_$name"]($ret);
return $ret;
}
}
class Foo
{
function bar() {
echo "bar \n";
}
}
$foo = new AOP(new Foo, [
'before_bar' => function() { echo "BEFORE\n"; },
'after_bar' => function() { echo "AFTER\n"; },
]);
$foo->bar(); // prints BEFORE...bar...AFTER
用法如下:
class AOP
{
function __construct($base, $methods) {
$this->base = $base;
$this->methods = $methods;
}
function __call($name, $args) {
$this->methods["before_$name"]($args);
$ret = call_user_func_array([$this->base, $name], $args);
$this->methods["after_$name"]($ret);
return $ret;
}
}
class Foo
{
function bar() {
echo "bar \n";
}
}
$foo = new AOP(new Foo, [
'before_bar' => function() { echo "BEFORE\n"; },
'after_bar' => function() { echo "AFTER\n"; },
]);
$foo->bar(); // prints BEFORE...bar...AFTER
虽然我在这里写的不是一个答案,但当你按照这里的建议使用电话时,你必须格外小心。主要原因是您失去了对函数可见性的所有控制,所有函数都可以访问,这可能是您想要的,也可能不是您想要的 但是,除了_;调用之外,您需要的是一个代理包装器,请在以下线程中查看ocramius的答案:
请注意,应始终避免使用“调用”,如果“调用”是答案,则问题通常是错误的。您能用代码显示它吗?您希望如何使用它。@Mubo我已添加代码供您参考。我在旅行,所以我不能写太多了。我不是在问超载问题。我不明白你的答案,你能解释一下吗?这会有帮助的,可能是你想要什么不清楚,你应该编辑你的问题,让它清晰易懂。你需要什么?就像当你调用一个尚未定义的方法时,一个被自动调用的方法。@zavg hmmm。。。遗憾的是,在对象上下文中调用不可访问的方法时会触发
\uu call()他的方法是accessible@Mubo他问的很清楚。他希望在调用对象上的方法时执行一个函数。@FélixGagnon Grenier是的,他应该重写类(更改方法名称)并通过\u call
函数传递调用,正如@georg建议的那样