Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在调用类的成员函数时自动调用函数?_Php_Codeigniter_Oop_Zend Framework - Fatal编程技术网

Php 如何在调用类的成员函数时自动调用函数?

Php 如何在调用类的成员函数时自动调用函数?,php,codeigniter,oop,zend-framework,Php,Codeigniter,Oop,Zend Framework,在php中,在调用类的成员函数时,有没有可能自动调用新函数 例如:我编写了一个包含4个成员函数的类。 然后我为这个类创建了对象。 现在,我将根据需要调用任何一个函数。 当我调用该类的任何一个函数时。我需要做一些设置/逻辑,我该怎么做 注意:我不愿意在定义的函数中调用新函数,也不需要为所有定义的函数编写逻辑。我正在寻找任何神奇的方法。请告诉我 Class IMAP{ Function IMAP() { Do something } Function getfolders() { Do some

在php中,在调用类的成员函数时,有没有可能自动调用新函数

例如:我编写了一个包含4个成员函数的类。 然后我为这个类创建了对象。 现在,我将根据需要调用任何一个函数。 当我调用该类的任何一个函数时。我需要做一些设置/逻辑,我该怎么做

注意:我不愿意在定义的函数中调用新函数,也不需要为所有定义的函数编写逻辑。我正在寻找任何神奇的方法。请告诉我

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()\u call
函数传递调用,正如@georg建议的那样