PHP 5.4 - “关闭$this支持”

2022-08-30 08:58:36

我看到PHP 5.4的新计划功能是:特征,数组取消引用,JsonSerializable接口和称为'closure $this support'

http://en.wikipedia.org/wiki/Php#Release_history

虽然其他的要么立即清晰(JsonSerialiable,数组取消引用),要么我查找了细节(特征),但我不确定“闭包$this支持”是什么。我一直在谷歌搜索它或在 php.net 上找到任何有关它的东西都没有成功

有谁知道这应该是什么?

如果我不得不猜测,它将意味着这样的事情:

$a = 10; $b = 'strrrring';
//'old' way, PHP 5.3.x
$myClosure = function($x) use($a,$b)
             {
                 if (strlen($x) <= $a) return $x;
                 else return $b;
             };

//'new' way with closure $this for PHP 5.4
$myNewClosure = function($x) use($a as $lengthCap,$b as $alternative)
                 {
                     if(strlen($x) <=  $this->lengthCap)) return $x;
                     else 
                     {
                         $this->lengthCap++;  //lengthcap is incremented for next time around
                         return $this->alternative;
                     }
                 };

意义(即使这个例子是微不足道的)是,在过去,一旦构造了闭包,绑定的“use”变量是固定的。有了“关闭$this支持”,他们更像是你可以搞砸的成员。

这听起来是否正确和/或接近和/或合理?有谁知道这种“关闭$this支持”是什么意思?


答案 1

这已经在 PHP 5.3 中进行了计划,但是

对于 PHP 5.3 $this对闭包的支持被删除,因为无法就如何以理智的方式实现它达成共识。此 RFC 描述了在下一个 PHP 版本中实现它的可能道路。

这确实意味着您可以参考对象实例(实时演示))

<?php
class A {
  private $value = 1;
  public function getClosure() 
  {
    return function() { return $this->value; };
  }
}

$a = new A;
$fn = $a->getClosure();
echo $fn(); // 1

有关讨论,请参阅 PHP 维基

以及出于历史兴趣:


答案 2

戈登错过的一件事是 重新绑定 .虽然他所描述的是默认行为,但可以重新绑定它。$this

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 foo
var_dump($f('bar')); // works! prints bar

$b = new B();
$f2 = $f->bindTo($b);
var_dump($f2('foo')); // prints baz
var_dump($f2('bar')); // error

$f3 = $f->bindTo($b, $b);
var_dump($f3('bar')); // works! prints bazinga

闭包实例方法(或者使用 static )将返回一个新的闭包,并重新绑定到给定的值。范围是通过传递第二个参数来设置的,这将确定从闭包内访问时私有和受保护成员的可见性。bindToClosure::bind$this


推荐