覆盖以前使用的函数

时间:2011-09-29 22:05:50

标签: php irc auto-update keep-alive

我正在使用PHP制作irc bot。在开发时,我希望能够动态加载和卸载类/函数。

请注意,PHP保持活力。

例如:

主文件

class stuff {

    function stuff() { echo 'this'; }

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

下一步

我编辑了一个功能

function stuff() { echo 'that'; }

理想情况下,现在它已被编辑,我所要做的就是触发replaceFunction()来更新旧函数。

我怎样才能让它真正起作用?

2 个答案:

答案 0 :(得分: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

该类的好处是您可以更好地控制分配和调用函数。

答案 1 :(得分: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();