百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> PHP+Swoole的闭包写法
分享文章到:

PHP+Swoole的闭包写法

发布时间:09/01 来源:未知 浏览: 关键词:
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相关知识,请拜访PHP中文网!

以上就是PHP+Swoole的闭包写法的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板