php - 将代码(方法)注入(inject)类?

标签 php oop

使用这个简单的代码:

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_addrunkit以获得“适当”的解决方案。 - 如果在您的 PHP 中可用。

关于php - 将代码(方法)注入(inject)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5723045/

相关文章:

php - mod_rewrite 的小问题

php - 在 PHP 中使用内联 CSS、HTML 并排放置图像

php - 使用 jquery 传递的 GET 变量

oop - OCaml封装

java - 将 TreeMap 的键存储在值中(java)

PHP - 为什么数组中两个项目的值都会发生变化?

php - mysqli 和字段类型

java - 对象数组的初学者混淆

python : Difference between static methods vs class method

c# - 在 C# 中使用枚举作为整型常量