类上下文中的call_user_func(定义了$ this)

时间:2011-04-05 09:21:16

标签: php

有没有办法如何在对象的上下文中执行PHP5.3中的闭包?

class Test {
    public $name='John';

    function greet(){
        eval('echo "Hello, ".$this->name;');

        call_user_func(function(){
            echo "Goodbye, ".$this->name;
        });
    }
}
$c = new Test;
$c->greet();

eval()可以正常工作,但是call_user_func将无法访问$ this。 (不在对象上下文中使用$ this )。 我现在正在通过“$ this”作为关闭的论据,但这并不是我所需要的。

4 个答案:

答案 0 :(得分:6)

从PHP 5.3.6开始,无法从lambda或闭包访问$this。您必须将$this分配给temp var并将其与use一起使用(这意味着您只能使用公共API)或传入/使用所需的属性。所有这些都显示在本网站的其他地方,所以我不会重申。

虽然对于PHP.next,但在Trunk中可以访问$thishttp://codepad.viper-7.com/PpBXa2

答案 1 :(得分:4)

对于实际的闭包,这是唯一的方法:

$obj = $this;
call_user_func(function () use ($obj) {
    echo "Goodbye, " . $obj->name;
});

将对象作为参数传递给其他答案可能更为优雅(可能正如您已经在做的那样)。

答案 2 :(得分:0)

怎么样:

class Test {
    public $name='John';

    function greet(){
        eval('echo "Hello, ".$this->name;');

        call_user_func(function($obj){
            echo "Goodbye, ".$obj->name;
        }, $this);
    }
}
$c = new Test;
$c->greet();

答案 3 :(得分:0)

call_user_func(function($name){
            echo "Goodbye, ".$name;
        }, $this->Name);