0

我所有的网站都有一个共同的启动器,它处理 url、文件位置等。有 3 种情况需要处理 - 是目录、文件存在和文件不存在。每个应用程序都有每个案例的唯一代码。我决定稍微修改一下runkit,我正在尝试统一代码。每个案例都将由一个函数处理,该函数可以通过 runkit 重新定义。

考虑这段代码:

class start {
   function __construct() {
       $this->options = array();
   }

   public function process() {
       // some code here
       $this->file_not_exists();
   }

   public function file_not_exists() {
       $this->options['page'] = 222;
   }

   public function redefine($what, $code) {
       runkit_method_redefine(get_class($this), $what, '', $code, RUNKIT_ACC_PUBLIC);
   }
}

$start = new start();

$start->redefine('file_not_exists', '$this->options["page"] = 333;')

//  page is now 333

这部分按预期工作。但是当我尝试更改代码以便重新定义的方法调用用户函数时,它可以工作。但是,看在上帝的份上,我不知道如何将$this传递给函数。

重新定义方法如下所示:

public function redefine($what, $code) {
    runkit_method_redefine(get_class($this), $what, '', 'call_user_func('.$code.'(), '.$this.');', RUNKIT_ACC_PUBLIC)
}

这不起作用,无论我尝试什么(call_user_func_array 也是如此)。我就是想不通。作为记录:

public function redefine($what, $code) {
    my_user_function($this);
}

行得通。

任何帮助表示赞赏。

请注意,这只是一个实验,我想知道如何做到这一点:)

编辑:我得到:

Catchable fatal error: Object of class starter could not be converted to string in blablallala\rewrite_starter2.php on line 153
4

2 回答 2

0

{...不必要地删除...}

==== 编辑 =====

【对于新问题,你需要的是这个】

<?
class start {
   function __construct() {
       $this->options = array();
   }

   public function process() {
       // some code here
       $this->file_not_exists();
   }

   public function file_not_exists() {
       $this->options['page'] = 222;
   }

   public function redefine($what, $code) {
       runkit_method_redefine(get_class($this), 
       $what, 
       '', 
       'call_user_func(array($this,' .$code. '),$this);', 
       RUNKIT_ACC_PUBLIC);
   }

   public function my_func($someobj)
   {
        print_r($someobj);
   }
}


$start = new start();
$start->redefine('file_not_exists', 'my_func');

$start->process();

?>
于 2011-01-31T10:13:50.013 回答
0

call_user_func函数的文档说第一个参数是' callable '。所以要动态调用类方法,你应该通过array($obj, 'func_name').

于 2012-09-09T20:13:25.387 回答