在php中,有一种方法可以在调用类
的成员函数时自动调用新函数例如:我编写了一个包含4个成员函数的类。 然后我为该类创建了对象。 现在我将根据需要调用任何一个函数。 当我调用该类的任何一个函数时。我需要做一些set / Logic,我该怎么做呢
注意:我不愿意在定义的函数中调用新函数,也不需要为所有已定义的函数编写逻辑。我正在寻找任何魔术方法。请指教我
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()
{
}
}
这个类包含很多函数我不能在所有函数中添加这个函数
答案 0 :(得分:3)
如果您不想a full-blown AOP library,可以从这样的小包装器开始:
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
答案 1 :(得分:0)
您应该查看PHP 魔术函数 __call
,它允许您实现方法重载。
答案 2 :(得分:0)
虽然我在这里写的不是每个人的答案,但在使用__CALL时必须非常小心。主要原因是您失去了对功能可见性的所有控制,所有功能都可以访问,这可能是您想要的,也可能不是。
除了__CALL之外,你想要的是一个代理包装器,在这个帖子中查看ocramius的答案:
How to auto call function in php for every other function call
请注意,应始终避免使用__CALL,如果__CALL是答案,则问题通常是错误的。