php初心者, 记录自己工作和学习路上的感想和笔记

0%

PHP匿名函数以及call_user_func的思考

图片alt

配图依然与主题无关,仅仅是我个人喜欢而已,今天要说的是关于 call_user_func 的一些理解。

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

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

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

1
2
3
4
5
6
7
8
9
10
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 赋值的方法。

1
2
3
4
5
6
7
8
9
10
/**
* Set the default Presenter resolver.
*
* @param \Closure $resolver
* @return void
*/
public static function presenter(Closure $resolver)
{
static::$presenterResolver = $resolver;
}

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

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

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

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

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