开发者

call_user_func within class context (with $this defined)

Is there a way how to execute closure in PHP5.3 within a context of an object?

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();

The eval() would work fine, however call_user_func will have no access to $this. (Using $this when not in object context开发者_如何学C). I am passing "$this" as an argument to closure right now, but that's not exactly what I need.


Access to $this is not possible from lambda or closure as of PHP 5.3.6. You'd either have to assign $this to a temp var and use that with use (which means you will only have the public API available) or pass in/use the desired property. All shown elsewhere on this site, so I won't reiterate.

Access to $this is available in Trunk though for PHP.next: http://codepad.viper-7.com/PpBXa2


For an actual closure, this is about the only way to do it:

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

It's probably more elegant to pass the object as parameter as suggested in the other answers (and probably as you're already doing).


what about:

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();


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜