English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Una clausura es una función que encapsula el estado circundante en el momento de su creación. Incluso si el entorno en el que se encuentra la clausura ya no existe, el estado encapsulado en la clausura sigue existiendo.
Una función anónima es una función sin nombre. Las funciones anónimas pueden asignarse a variables y pueden transmitirse como cualquier otro objeto PHP. Sin embargo, las funciones anónimas son funciones, por lo que pueden llamarse y pueden recibir parámetros. Las funciones anónimas son especialmente adecuadas como devoluciones de llamada de funciones o métodos.
Nota: Teóricamente, clausuras y funciones anónimas son conceptos diferentes. Sin embargo, PHP las considera como conceptos idénticos. Por lo tanto, cuando mencionamos clausuras, también nos referimos a funciones anónimas y viceversa.
La sintaxis de PHP para clausuras y funciones anónimas es la misma que para las funciones comunes, pero las clausuras y las funciones anónimas son objetos que se disfrazan de funciones (instancias de la clase Closure).
Crear clausura
$closure = function($name){ return sprintf("Hola %s", $name); } echo $closure("jerry"); // Detectar si la variable $closure es una clausura var_dump($closure instanceof Closure);
El código anterior crea un objeto de clausura y lo asigna a la variable $closure. La clausura es muy similar a una función PHP común, utiliza la misma sintaxis, recibe parámetros y puede devolver valores.
Explicación: Podemos llamar a la variable $closure porque su valor es una clausura y el objeto de clausura ha implementado el método mágico __invoke(). Si hay () después del nombre de la variable, PHP buscará y llamará al método __invoke().
Usar clausuras
Generalmente, usamos las clausuras PHP como funciones y métodos de devolución. Muchos funciones PHP utilizan funciones de devolución, como array_map() y preg_replace_callback(). En el siguiente ejemplo, usaremos array_map() para procesar un array, aumentando cada elemento del array.1:
$nubmers = array_map(function($number){ return $number++; }, [1,2,3]); var_dump($numbers);
Adjuntar estado
Las clausuras PHP no encapsulan automáticamente el estado de la aplicación como las clausuras reales de javascrypt, debemos llamar manualmente al método bindTo() del objeto clausura o usar la palabra clave use para adjuntar el estado a la clausura PHP.
Usar la palabra clave use
El uso de la palabra clave use para adjuntar el estado de la clausura es más común, por lo que primero veamos esta manera. Al adjuntar variables a la clausura usando la palabra clave use, las variables adjuntas recuerdan el valor asignado en el momento del adjunto.
function Car ($name){ return function($statu)use($name){ return sprintf("Car %s is %s", $name, $statu); } } // Encapsular el nombre del coche en una clausura $car = Car("bmw"); // Llamar a la acción del coche // Salida--> "bmw is running" echo $car("running");
Nota: se puede usar la palabra clave use para pasar varios parámetros a la clausura, en este caso, se deben usar comas para separar varios parámetros, como los parámetros de una función o método PHP.
Usar bindTo() para adjuntar el estado de la clausura
Al igual que otros objetos PHP, cada instancia de clausura puede usar la palabra clave $this para obtener el estado interno de la clausura. El estado predeterminado del objeto clausura no es muy útil, pero tiene un método mágico __invoke() y bindTo().
El método bindTo() añade algunas potencias interesantes a las clausuras. Podemos usar este método para unir el estado interno del objeto Closure a otros objetos.
El segundo parámetro de bindTo() es muy importante, ya que su función es especificar la clase PHP al que pertenece el objeto al que se binda la clausura. Por lo tanto, la clausura puede acceder a las variables miembro protegidas y privadas del objeto al que se binda.
class TestClosure { private $name=[]; private $age; private $sex; public function addPerson($name, $personCallback){ // Vincular el objeto de clausura a la instancia actual $this->nombre[$name] = $personCallback->bindTo($this, __CLASS__); } public function display($name){ foreach ($this->nombre como $key => $callback){ if($key == $name){ // Ejecutar el objeto de clausura, adjuntar el estado de la clausura a la clase $callback(); } } echo "nombre : {$name}\n"; echo "edad : {$this->edad}\n"; echo "sexo : {$this->sex\n"; } } $person = new TestClosure(); $person->addPerson("jerry", function(){ $this->edad = 19; $this->sex = "hombre"; }); $person->display("jerry"); /** salida nombre : jerry edad : 19 sex : hombre */
Resumen
Lo mencionado anteriormente es lo que el editor les ha presentado sobre closures y funciones anónimas en PHP, esperando que les haya sido útil. Si tienen alguna pregunta, déjenme un mensaje y responderé a tiempo. También agradezco mucho el apoyo de todos a la página web de Tutorial de Gritar!