2011-09-29 102 views
1

我正在使用PHP製作irc bot。在開發過程中,我希望能夠動態加載和卸載類/函數。覆蓋以前使用的功能

請注意,PHP是保持活力的。

例如:

主文件

class stuff { 

    function stuff() { echo 'this'; } 

    function replaceFunction() { 
     remove(stuff); 
     add(stuff); 
    } 
} 
$stuff = new stuff(); 

下一頁

我編輯功能

function stuff() { echo 'that'; } 

那麼理想,現在,它的編輯,所有我要做觸發replaceFunction()來更新舊函數。

我怎樣才能使這個實際工作?

+0

重新定義內存中的對象類別?我想知道那會是怎樣的......。 – hakre

回答

1

如果你唯一需要的是有一個具有函數的類,你希望能夠通過觸發replaceFunction交換函數的功能,你可以分配一些關閉的那類或類似:

class stuff { 
    private $callback; 
    public function __construct() 
    { 
     $this->callback = array($this, 'stuff'); 
    } 

    public function __invoke() 
    { 
     call_user_func($this->callback); 
    } 

    private function stuff() { echo 'This'; } 

    function replace($function) { 
     $this->callback = $function; 
    } 
} 


$stuff = new stuff; 

$stuff(); # original function 

$stuff->replace(function() { echo 'That'; }); 

$stuff(); # replaced function 

還是短版:

$stuff = function() {echo 'This';}; 

$stuff(); # original function 

$stuff = function() {echo 'That';}; 

$stuff(); # replaced function 

該類具有您可以更好地控制分配和調用函數的好處。

+0

這真的很酷。是否有任何安全隱患? – Ted

+0

你認爲什麼樣的安全性?這基本上是注入代碼,所以我假設你知道你在做什麼,不是嗎? – hakre

+0

我看到(並且必須修復)一次由於函數名稱作爲變量傳遞而導致的安全漏洞(災難)。所以,當我看到人們接受函數名稱作爲變量時,安全性現在是我首先想到的。但那是一個url變量,而這裏任何安全問題都將由開發者創建。你的答案看起來不錯。 – Ted

0

也許你可以刪除第一

runkit_function_remove (string $funcname); 

使用function_exists()功能檢查功能已經存在。

編輯:

class stuff { 
    function replaceFunction() { 
     runkit_function_remove('stuff'); 
     function stuff() { echo 'New stuff'; } 
    } 
} 
$stuff = new stuff(); 
$stuff->replaceFunction(); 
+0

我已經更新了我的問題,以便更清楚,這絕對是一個好開始。 –

+0

那裏,我讓你的代碼更簡單。 – PhpXp