2014-09-18 39 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就是答案,問題通常是錯誤的。