sintaxis etiquetas ejemplos bloque php closures

etiquetas - PHP 5.4-''cierre $ este soporte''



php</ php (4)

Veo que las nuevas características planeadas para PHP 5.4 son: rasgos, desreferenciación de arreglos, una interfaz JsonSerializable y algo llamado '' closure $this support ''

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

Mientras que los otros son inmediatamente claros (JsonSerialiable, eliminación de referencias de matriz) o busqué los detalles (rasgos), no estoy seguro de qué es ''cierre $ este soporte''. No he tenido éxito buscando en Google ni encontrado nada al respecto en php.net

¿Alguien sabe lo que se supone que es esto?

Si tuviera que adivinar, significaría algo como esto:

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

La importancia (incluso si este ejemplo es trivial) es que en el pasado, una vez que se construye el cierre, las variables de ''uso'' consolidadas son fijas. Con ''cierre $ this support'' son más como miembros con los que puedes meterse.

¿Suena correcto y / o cercano y / o razonable? ¿Alguien sabe lo que significa este ''cierre $ este apoyo''?


Basándome en las otras respuestas aquí, creo que este ejemplo demostrará lo que es posible 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"

ver: https://eval.in/private/3183e0949dd2db


Basándose en la respuesta de @ Gordon, es posible imitar algunos aspectos hacky del cierre: $ this en PHP 5.3.

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


Esto ya estaba planeado para PHP 5.3, pero

Para PHP 5.3 $, este soporte para Closures se eliminó porque no se pudo llegar a un consenso sobre cómo implementarlo de manera sensata. Este RFC describe los posibles caminos que se pueden tomar para implementarlo en la próxima versión de PHP.

De hecho, significa que puede consultar la instancia del objeto ( demostración en vivo )

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

Para una discusión, vea el PHP Wiki

y para el interés histórico:


Una cosa que Gordon perdió es la re-vinculación de $this . Si bien lo que describió es el comportamiento predeterminado, es posible volver a vincularlo.

Ejemplo

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

El método de instancia bindTo (alternativamente use el Closure::bind static Closure::bind ) devolverá un nuevo cierre con $this re-bound al valor dado. El alcance se establece al pasar el segundo argumento, esto determinará la visibilidad de los miembros privados y protegidos, cuando se accede desde dentro del cierre.