2014-09-18 139 views
2

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

这个类包含了很多功能,我不可能在所有功能

+0

你可以在代码中显示它,你希望如何使用它。 – Mubo 2014-09-18 20:22:56

+0

@Mubo我已经为你的参考添加了代码。我在旅游,所以我不能写更多 – 2014-09-18 20:46:47

回答

0

添加此功能,你应该看看PHP 神奇的功能__call,让您实现方法重载。

+0

我不问超载。我不明白你的答案,你可以请解释我可能会有所帮助 – 2014-09-18 20:31:54

+0

你想要的不清楚,你应该编辑你的问题,并明确说明,以便于理解。你需要 ?比如当你调用尚未定义的方法时,会自动调用一个方法。 – Mubo 2014-09-18 20:34:49

+1

@zavg嗯......不幸的是,调用对象上下文中不可访问的方法时会触发__call()。 “他的方法可以访问 – 2014-09-18 20:35:30

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 
0

而我正在写在这里是不是回答说,使用__CALL时必须非常小心,正如这里所建议的。主要原因是你失去了对功能可见性的全部控制,所有的功能都可以访问,这可能是也可能不是你想要的。

除了__call不过,你要什么叫代理包装,在这个线程退房的答案被ocramius:

How to auto call function in php for every other function call

注意__call应该总是尽量避免,如果__call就是答案,问题通常是错误的。

相关问题