当我调用类的成员函数时如何自动调用函数?

时间:2014-09-18 20:19:40

标签: php codeigniter oop zend-framework

在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()
{
}
}

这个类包含很多函数我不能在所有函数中添加这个函数

3 个答案:

答案 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是答案,则问题通常是错误的。