所有我的网站共享一个共同的启动器,它处理网址,文件位置等。有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
答案 0 :(得分: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();
?>
答案 1 :(得分:0)
call_user_func
函数的文档说第一个参数是'callable'。因此,要动态调用类方法,您应该传递array($obj, 'func_name')
。