本站网址www.sosocms.cn

PHP+Swoole的闭包写法【php教程】,Swoole,闭包

PHP教程 搜搜CMS网 9个月前 (11-26) 323次浏览 0个评论 扫描二维码

JS顺序员老是讪笑PHP没有闭包,本日抽闲写一篇文章来特地引见一下PHP的闭包。从5.3版本最先PHP就增添了匿名函数支撑,经由数个版本迭代到现在的PHP5.6、PHP7,PHP言语的闭包已异常完美了。再连系Swoole供应的事宜驱动支撑,PHP的闭包功用异常壮大而且很文雅。

匿名函数

匿名函数是闭包的中心,匿名函数在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相干学问,请接见ki4网!

以上就是PHP+Swoole的闭包写法的细致内容,更多请关注ki4网别的相干文章!


版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP+Swoole的闭包写法【php教程】,Swoole,闭包
喜欢 (0)