modern php closure 闭包
* 在array_map()函数中使用闭包
<?php $numbersPlusOne = array_map(function($number) { return $number + 1; }, [1,2,3]); print_r($numbersPlusOne);
$ php numbersPlusOne.php
Array
(
[0] => 2
[1] => 3
[2] => 4
)
* 使用use关键字附加闭包的状态
<?php function enclosePerson($name) { // use 可以把多个参数传入闭包 return function($doCommand) use ($name) { return sprintf('%s, %s'.PHP_EOL, $name, $doCommand); }; } $clay = enclosePerson('Clay'); echo $clay('get me some sweet tea!');
Clay, get me some sweet tea!
* 使用bindTo方法附加闭包的状态
<?php class App { protected $routes = []; 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($currrentPath) { foreach ($this->routes as $routePath => $callback) { if ($routePath === $currrentPath) { $callback(); } } header('HTTP/1.1 ', $this->responseStatus); header('Content-Type: ', $this->responseContentType); header('Content-length: ', mb_strlen($this->responseBody)); echo $this->responseBody; } } $app = new App(); $app->addRoute('/users/josh', function() { $this->responseContentType = 'application/json; charset=utf8'; $this->responseBody = '{"name": "Josh"}'; }); $app->dispatch('/users/josh'); echo PHP_EOL; // {"name": "Josh"}