最新公告
  • 欢迎您访问爱上源码网,分享精品整站源码,网站模板,游戏源码,APP小程序源码以及视频教程免费下载;服务永无止境!立即加入我们
  • PHP+Swoole的闭包写法

    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的闭包写法的详细内容,更多请关注爱上源码网其它相关文章!

  • 微信
  • 分享
  • 相关标签:Swoole 闭包
  • 本文转载于:rango.swoole.com,如有侵犯,请联系916990011@qq.com删除
    • 上一篇:var_export与var_dump的不同
    • 下一篇:PHP如何为函数执行设置超时

    相关文章

    相关视频

    • php为什么要用swoole?
    • Laravel集成Swoole教程
    • php闭包函数是什么
    • php7.1如何安装swoole扩展
    • PHP+Swoole的闭包写法
    • 闭包终极面试题
    • 闭包概念
    • 闭包

    本文有爱上源码下载完入驻作者发布,如果对您版权造成侵害,可以联系本站站长管理进行维权删除,本站收到维权24小时内进行处理,谢谢您关注23ym.cn!
    本站分享大量程序员技术文章以及对编程开发的初级入门教程,包括图文讲解笔记和高清视频下载~

    重要声明:
    1.本站视频教程,软件及网站源码版权均属于原作者所有,您必须在下载后的24个小时之内,从您的电脑中删除!非法商业用途,后果自负!
    2.本站不保证所提供下载资源的安全性和完整性,仅供下载学习之用!如链接失效或资源含外站广告,请联系客服处理!给予奖励!
    3.本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!本站提供有偿服务!如有侵权请联系在线客服!
    4.如您手中有优质资源或教程,可以自助投稿发布,成功分享后有奖励和额外收入!
    5.如您需要正版微擎模块可联系本站客服,我们有价值30w+商业微擎应用出售微擎坑位和招收代理!
    6.400电话/软著/ICP,EDI许可证/商标特价办理中!
    爱上源码下载网 » PHP+Swoole的闭包写法

    常见问题FAQ

    从网站下载的源码都有安装教程么?不会安装怎么办?
    本站发布的网站源码和模板资源大部分在压缩包内都有教程,如您不会安装可以联系本站在线技术进行付费安装。
    爱上源码的所有源码都是亲测能正常运行的么?
    本站目前拥有资源10w+,包含整站源码,网站模板,游戏源码,小程序源码,视频教程,破解软件等,每天也在测试更新;因时间和精力有限我们无法对资源进行一一测试,只能保证所分享资源内容无误,希望理解。
    我手中的优质资源可以在你这换钱或者VIP么?
    爱上源码支持投稿,欢迎发布您手中的优质资源进行售卖;本站VIP支持免费获取,目前邀请10人注册爱上源码即可免费获取VIP。
    爱上源码除了资源分享还有其他业务没?
    【价值30W+微擎模块出售正版商业微擎坑位及招收代理,详情咨询本站客服!】我们团队目前运营并推广几套商业化saas智能小程序系统能满足大部分小程序开发需求,并由SaaS和独立部署版商城小程序系统;另外销售400电话,各种ICP/EDI资质证书办理,软著和商标注册服务等。

    发表评论

    • 22会员总数(位)
    • 33905资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 376稳定运行(天)

    提供最优质的资源集合

    开通VIP 源码下载