使用这个简单的代码:
class MyClass {
public $customFunction = array();
public function run($name){
call_user_func($this->customFunction[$name]);
}
}
//> Usage:
$c = new MyClass();
$c->customFunction['first'] = function (){ /* some code*/ };
$c->run('first');
此 cose 按预期工作。我将该函数添加到 $customFunction
,然后我可以在 run();
方法中调用它。
当我在注入(inject)的函数中尝试做一些与对象相关的事情时,问题就来了,例如,如果我添加这个函数:
$c->customFunction['first'] = function(){ $this->callsomemethod(); }
当我调用 run();
方法时,PHP 说我不能在静态上下文中使用 $this
。
我有办法注入(inject)那些函数并能够使用对象方法吗?
(注意:当然我的类(class)只是一个例子,我需要这个作为一个范围)
谢谢
感谢马里奥,这里是我将使用的解决方案:
public function run($name) {
call_user_func($this->customFunction[$name],$this);
}
此时我只需要添加一个带有参数的函数,如下所示:
= function ($this) { /*some code*/};
$this
将模拟对象上下文范围。
最佳答案
错误源于您在示例中显示为 /* some code*/
的代码。
你在这里分配一个匿名函数:
$c->customFunction['first'] = function (){ /* some code*/ };
它仍然只是一个函数。它不会成为类(class)的真正方法。所以在其中使用 $this
是行不通的。
解决方法:向您的自定义函数传递一个 $obj
参数,并让它们使用该参数而不是 $this
。 (真的,只是一个古怪的解决方法;但可行。)
call_user_func($this->customFunction[$name], $obj=$this);
或者尝试 classkit_method_add
或 runkit
以获得“适当”的解决方案。 - 如果在您的 PHP 中可用。
关于php - 将代码(方法)注入(inject)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5723045/