PHP 5.4 – “closures$这个支持”

我看到,PHP 5.4的新计划function是:traits,数组解引用,JsonSerializable接口以及被称为“ closure $this support

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

虽然其他人要么立即清除(JsonSerialiable,数组解引用),或者我查了具体(特质),我不知道什么'这个支持'是'封闭'。 我一直没有成功googling或在php.netfind任何关于它

有人知道这应该是什么?

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

 $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; } }; 

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

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

这已经计划在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 

有关讨论,请参阅PHP Wiki

  • 闭包:对象扩展

和历史利益:

  • closures(rfc)
  • 去除此(rfc:闭包)

Gordon错过的一件事是重新绑定$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 

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

  • PHP:closures
  • 博客文章:PHP 5.4中的闭包对象绑定

在@Gordon的答案的基础上,可以在PHP5.3中模仿一些closures的方面。

 <?php class 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 

只是build立在这里的其他答案,我认为这个例子将演示什么是可能的PHP 5.4+:

 <?php class Mailer { public $publicVar = 'Goodbye '; protected $protectedVar = 'Josie '; private $privateVar = 'I love CORNFLAKES'; public function mail($t, $closure) { var_dump($t, $closure()); } } class SendsMail { public $publicVar = 'Hello '; protected $protectedVar = 'Martin '; private $privateVar = 'I love EGGS'; public function aMailingMethod() { $mailer = new Mailer(); $mailer->mail( $this->publicVar . $this->protectedVar . $this->privateVar, function() { return $this->publicVar . $this->protectedVar . $this->privateVar; } ); } } $sendsMail = new SendsMail(); $sendsMail->aMailingMethod(); // prints: // string(24) "Hello Martin I love EGGS" // string(24) "Hello Martin I love EGGS" 

请参阅: https : //eval.in/private/3183e0949dd2db