PHP+Swoole的闭包写法
匿名函数
匿名函数是闭包的中心,匿名函数在PHP里实际上是一个Closure类的对象(请留意是对象)。与一般的面向对象编程方式不一样,匿名函数的代码是直接写在调取处的,不需要额外写一个类,编写办法的代码。这样的好处就是更直接。下面的示例是设定一个按时器,每2秒输出hello world。
传统写法
function timer () { echo "hello world"; } Swoole\Timer::tick(2000, 'timer');
闭包写法
Swoole\Timer::tick(2000, function () { echo "hello world"; });
非闭包的传统写法,先要声明一个函数,再转入函数名称字符串。两段代码是别离的,不足直不雅。而闭包的写法把按时器的声明和按时器要施行的代码写在了一起,逻辑非常清楚直不雅。使用闭包语法可以很利便编写回调函数。在事件驱动编程、排序、array_walk等需要会员传入一段施行代码的场景中,闭包的写法非常文雅。
闭包更强大的地方在于它可以直接在调取处引入外部变量。PHP中实现的办法就是use关键词。
Use语法
假如方才的按时器需要传入一个变量,传统的写法只能通过全局变量来实现。与JS不一样,PHP的变量引入是显式的,假如要援用外部变量必需使用use来声明。而JS是隐式的,匿名函数内部可以随便操纵外部变量,无需声明。这样好处是少写了一点代码,缺陷是存在风险和纷乱。
传统写法
$str = "hello world"; function timer () { global $str; echo $str; } Swoole\Timer::tick(2000, 'timer');
闭包写法
$str = "hello world"; Swoole\Timer::tick(2000, function () use ($str) { echo $str; });
闭包写法使用use直接引入了当前的$str变量,而不需要使用global全局变量。别的假如是在swoole的事件驱动编程模式,使用global就没法实现异步并发了,由于global全局变量只要1个,假如同时有多个客户端恳求,每个恳求要查询数据库,输出不一样的内容,传统的编程办法就不太容易实现,需要使用全局变量数组,以客户端的ID为KEY留存各自的数据。
传统写法
$requestArray = array(); $dbResultArray = array(); function my_request($request, $response) { global $dbResultArray, $requestArray; $queryId = $db->query($sql, 'get_result'); $requestArray[$request->fd] = array($request, $response); $dbResultArray[$queryId] = $request->fd; } function get_result($queryId, $queryResult) { global $dbResultArray, $requestArray; list($request, $response) = $requestArray[$dbResultArray[$queryId]]; $response->end($queryResult); } $server->on('request', 'my_request');
闭包写法
$server->on('request', function ($request, $response) { $queryId = $db->query($sql, function ($queryId, $queryResult) use ($request, $response) { $response->end($queryResult); }); });
传统的写法非常复杂,需要重复屡次从全局数组留存/提取数据。而闭包的写法非常简约文雅,只用了几行代码就实现了一样的功效。闭包写法非常适合用来编写异步非堵塞回调模式的效劳器程序。当前热门的编程说话中只要PHP和JS具备这种能力。
闭包更多特性
在类的办法中使用匿名函数,5.4以上的版本无需使用use引入$this,直接可以在匿名函数中使用$this来调取当前对象的办法。在swoole编程中,可以利用此特性减少$serv对象的use引入传递。
class Server extends Swoole\Server { function onReceive($serv, $fd, $reactorId, $data) { $db->query($sql, function ($queryId, $queryResult) use ($fd) { $this->send($fd, $queryResult); } } }
别的假如但愿在闭包函数中修改外部变量,可以在use时为变量增添&援用符号即可。留意对象类型不需要加&,由于在PHP中对象默许就是传援用而非传值。
更多PHP相关知识,请拜访PHP中文网!
以上就是PHP+Swoole的闭包写法的具体内容,更多请关注百分百源码网其它相关文章!