Uso de la función de cierre de PHP

Uno, cierre

  • 1) Se introdujeron cierres y funciones anónimas en PHP5.3.

  • 2). El cierre se refiere a la función que encapsula el estado alrededor de la función cuando se crea. Incluso si el entorno donde se encuentra el cierre no existe, el estado encapsulado por el cierre sigue existiendo. Esto es similar a la característica de cierre de Javascript.

  • 3) Una función anónima es una función sin nombre, una función anónima se puede asignar a una variable y también se puede pasar como cualquier otro objeto PHP. Puede pensar en funciones y cierres anónimos como el mismo concepto.

  • 4) Cabe señalar que la sintaxis utilizada por los cierres es la misma que la de las funciones ordinarias, pero en realidad es un objeto que pretende ser una función, una instancia de la clase Closure. Los cierres, como cadenas o números enteros, son tipos de valor de primera clase.

En segundo lugar, el uso de cierres

1. Función anónima
$变量名=functio(){  };		
2, como función de devolución de llamada
1)array_filter($数组,function( $v){

					规则	
					
		});
		根据规则筛选数组内容
2)$numbersPlusOne = array_map(function($number) {

    return $number + 1;
    
	}, [1, 2, 3]);
	
	根据函数内容,作用到数组每个值中,并且返回新数组

Tres, estado adicional

1). Tenga en cuenta que los cierres de PHP no encapsularán automáticamente el estado de la aplicación como JS. En PHP, debe llamar al método bindTo del objeto de cierre o utilizar la palabra clave use para adjuntar el estado al cierre de PHP.
<?php
function enclosePerson($name)
{
    return function ($doCommand) use ($name) {
        return sprintf('%s , %s', $name, $doCommand);
   } 
}
//把字符串“Clay”封装在闭包中
$clay = enclosePerson('Clay');
//传入参数,调用闭包
echo $clay('get me sweat tea!'); // Clay, get me sweat tea!

En este ejemplo, la función enclosePerson () tiene un parámetro $ name, esta función devuelve un objeto de cierre, este cierre encapsula el parámetro $ name, incluso si el objeto devuelto está fuera del alcance de la función enclosePerson (), recordará Keep el valor del parámetro $ name, porque la variable $ name todavía está en el cierre.


2). Utilice la palabra clave use para pasar varias palabras clave al cierre. En este momento, utilice comas para separar varios parámetros, como los parámetros de una función o método PHP.

3) .El cierre de PHP sigue siendo un objeto, puede usar la palabra clave $ this para obtener el estado interno del cierre. Hay un método mágico __invoke () y un método bindTo () en el estado predeterminado del cierre.

4) El método .bindTo () agrega algunas cosas interesantes al cierre.

Podemos utilizar este método para vincular el estado interno del objeto Closure a otros objetos. El segundo parámetro del método bindTo () puede especificar la clase PHP a la que pertenece el objeto vinculado al cierre, para que podamos acceder a las variables miembro protegidas y privadas de esta clase.

<?php
class App
{
    protected $route = array();
    protected $responseStatus = '200 OK';
    protected $responseContentType = 'text/html';
    protected $responseBody = 'Hello world';

    public function addRoute($routePath, $routeCallback)
    {
        $this->routes[$routePath] = $routeCallback->bindTo($this, __CLASS__);
    }

    public function dispatch($currentPath)
    {
        foreach($this->routes as $routePath => $callback) {
            if ($routePath === $currentPath) {
                 $callback();
            }
        }
        header('HTTP/1.1' . $this->responseStatus);
        header('Content-type: ' . $this->responseContentType);
        header('Content-length: ' . mb_strlen($this->responseBody));
        echo $this->responseBody;
    }
}

Vinculamos la devolución de llamada de enrutamiento a la instancia de la aplicación actual, de modo que el estado de la instancia de la aplicación se pueda manejar en la función de devolución de llamada.

<?php
$app = new App();
$app->addRoute('/users/xiaoxiao', function () {
    $this->responseContentType = 'application/json;charset=utf8';
    $this->responseBody = '{"name" : "xiaoxiao"}';
});
$app->dispatch('/users/xiaoxiao');

Supongo que te gusta

Origin blog.csdn.net/weixin_43272542/article/details/113125860
Recomendado
Clasificación