【问题标题】:Override previously used functions覆盖以前使用的函数
【发布时间】:2011-10-01 04:21:20
【问题描述】:

我正在使用 PHP 制作一个 irc 机器人。在开发过程中,我希望能够动态加载和卸载类/函数。

请注意,PHP 是保持活动状态的。

例如:

主文件

class stuff {

    function stuff() { echo 'this'; }

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

下一步

我编辑一个函数

function stuff() { echo 'that'; }

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

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

【问题讨论】:

  • 重新定义内存中的对象类?我想知道那会是什么样子...... .

标签: php irc auto-update keep-alive


【解决方案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

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

【讨论】:

  • 您认为哪种安全性?这基本上是注入代码,所以我假设您知道自己在做什么,不是吗?
  • 我看到(并且必须修复)一个安全漏洞(灾难),这是由于函数名作为变量传递而导致的。因此,当我看到人们接受函数名称作为变量时,我首先想到的就是安全性。但那是一个 url 变量,而这里的任何安全问题都是由开发人员创建的。你的回答似乎不错。
  • @Ted:是的,这将是开发人员创建的问题。并选择类变体(第一个示例)。这样做之后,您可以在以后调用或更改函数时保持控制。
【解决方案2】:

也许你可以先删除函数

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();

【讨论】:

  • 我已经更新了我的问题,使其更加清晰,这绝对是一个好的开始。
猜你喜欢
  • 2013-12-01
  • 2010-10-25
  • 2021-05-16
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
相关资源
最近更新 更多