PHP 5.4 - 'closure $this support' PHP 5.4 - 'closure $this support' php php

PHP 5.4 - 'closure $this support'


This was already planned for PHP 5.3, but

For PHP 5.3 $this support for Closures was removed because no consensus could be reached how to implement it in a sane fashion. This RFC describes the possible roads that can be taken to implement it in the next PHP version.

It indeed means you can refer to the object instance (live demo)

<?phpclass A {  private $value = 1;  public function getClosure()   {    return function() { return $this->value; };  }}$a = new A;$fn = $a->getClosure();echo $fn(); // 1

For a discussion, see the PHP Wiki

and for historic interest:


One thing that Gordon missed is re-binding of $this. While what he described is the default behaviour, it is possible to re-bind it.

Example

class A {    public $foo = 'foo';    private $bar = 'bar';    public function getClosure() {        return function ($prop) {            return $this->$prop;        };    }}class B {    public $foo = 'baz';    private $bar = 'bazinga';}$a = new A();$f = $a->getClosure();var_dump($f('foo')); // prints foovar_dump($f('bar')); // works! prints bar$b = new B();$f2 = $f->bindTo($b);var_dump($f2('foo')); // prints bazvar_dump($f2('bar')); // error$f3 = $f->bindTo($b, $b);var_dump($f3('bar')); // works! prints bazinga

The closures bindTo instance method (alternatively use the static Closure::bind) will return a new closure with $this re-bound to the value given. The scope is set by passing the second argument, this will determine visibility of private and protected members, when accessed from within the closure.


Building on @Gordon's answer it is posible to mimic some hacky aspects of closure-$this in PHP 5.3.

<?phpclass A{    public $value = 12;    public function getClosure()    {        $self = $this;        return function() use($self)        {            return $self->value;        };    }}$a = new A;$fn = $a->getClosure();echo $fn(); // 12