PHP 匿名函数以及 call_user_func 的思考

本分同步发表自:http://www.h57.pw/aritlce/23

首先感谢 @bluegeek ,帮我解决了我脑残的地方

以前对于闭包和匿名函数的理解不是太好。所以,今天在 phphub 提问的时候犯了一个比较二的错误,趁着晚上回家赶紧总结一下,增强自己的记忆。

话说以前对于闭包或者匿名函数都是自己写自己调用,所以没有出现过什么问题,但是前几天在弄 laravel 分页的时候,发现里面有一个 $presenter 自己知道这个可能会让我的代码更简洁,但是我却不知道如何调用,在 phphub 提问的时候有人告诉了我怎么使用,但是我却对参数列表比较迷惑,是如何获取参数列表的。今天终于有人告诉了我,我才发现对于 php 的一些函数理解的并不是很到位。于是乎赶紧翻阅 php 文档,把 call_user_func 再次理解一下。参见: (http://php.net/manual/zh/function.call-use...) 。

文档说的比较明白,第一个参数是方法名称,余下的参数就是调用方法的参数列表了。

    public function render(Presenter $presenter = null)
    {
        if (is_null($presenter) && static::$presenterResolver) {
            $presenter = call_user_func(static::$presenterResolver, $this);
        }

        $presenter = $presenter ?: new BootstrapThreePresenter($this);

        return $presenter->render();
    }

所以,这个 render 方法里面就比较容易理解了,当我们传入的 $presenter 为空的时候,并且 static::$presenterResolver ($static是延迟绑定,这个也可以在文档里面找到)已经赋值的时候,就会执行 if 代码段里面的内容了。在我的代码中主要应用的是 LengthAwarePaginator 类里面的相关方法(其实还有一个 Paginator 类,这个类是用在那个 simple 的简单分页中的),在这里面我并没有找到为 $presenter 赋值的方法,所以我们去他们的父类 AbstractPaginator 中寻找,果然里面有为 $presenter 赋值的方法。

    /**
     * Set the default Presenter resolver.
     *
     * @param  \Closure  $resolver
     * @return void
     */
    public static function presenter(Closure $resolver)
    {
        static::$presenterResolver = $resolver;
    }

可以看到这里面接受的参数是一个闭包或者说匿名函数(这两个东西我还得理解一下)。

至此,一些就很通顺了。我们传入的匿名函数的参数是 AbstractPaginator 的具体实现类,里面实现了分页相关渲染的方法。

所以,我们最终在provider里面待用相关的设置方法

        // 设定分页主题
        LengthAwarePaginator::presenter(function ($paginator) {
            return new AmazeuiThreePresenter($paginator);
        });

这样我们在模板里面直接调用 render 即可,也不用时刻记得传入参数了。

最后,@summer 能不能求个友链,我晚上回家就添加上 phphub(当然我的博客还没有 link 部分,晚上回家实现出来)

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4
Summer

已经给你加了友链,不过你后面要维护好自己博客内容,我们会不定期清理低质量的博客,因为酷站的博客都是 推荐 的博客。

7年前 评论
leo

其实个人比较推荐使用call_user_func_array,一个是当参数比较多的时候不会太难看,另外一个是可以传入引用类型的变量,这个call_user_func做不到

7年前 评论

@Summer 感谢,会在博客持续更新内容的

7年前 评论

@leo 感谢说明,我会在我自己的项目中试用的,上面的文章主要是分析 laravel 分页的部分的

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!