PHP 5.4 - 如何'关闭$这个支持'?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我发现PHP 5.4的新计划功能包括:特征,数组解引用,JsonSerializable接口以及被称为“ closure $this support'

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

虽然其他人要么立即清除(JsonSerialiable,数组解引用),要么查找具体(traits),我不确定'这个支持'是什么'。我一直没有成功搜索它或在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;
                     }
                 };

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

这听起来是否正确和/或关闭和/或合理?有谁知道这个'关闭$这个支持'是什么意思?

提问于
用户回答回答于

这已经是为PHP 5.3计划的,但是

对于PHP 5.3 $,这种对闭包的支持被删除,因为没有达成共识如何以一种理智的方式实现它。本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
用户回答回答于

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

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

扫码关注云+社区