顺晟科技
2021-06-16 10:32:53
240
自从使用Laravel框架以来,我一直在学习如何让自己的代码更加优雅。今天看框架源代码,发现很多地方都用call_user_func_array,而且这个方法极其好用。我来列举几个可以经常使用的地方:
Redis实例静态调用
众所周知,在PHP中连接和操作Redis需要以下步骤:
$ Redis=new Redis();
$ status=$ rds-connect(' 127 . 0 . 0 . 1 ',6379,1);
if(!$status)返回false
var _ dump($ redis-get(' key '));
您必须使用实例和-来访问该方法,并且您不能使用像Redis:get($key)这样的静态调用编写。
而且Redis需要连接多个控制器,每次写多个连接代码非常麻烦,所以call_user_func_array和__callstatic就派上用场了:
类RedisHandle
{
private static $ redis
私有静态$状态;
public static function _ _ callStatic($ method,$arguments) {
if(!self:$status) {
self : $ Redis=new \ Redis();
self : $ status=self : $ redis-pconnect(' 127 . 0 . 0 . 1 ',6379,1);
}
返回self: $状态?call _ user _ func _ array([self : $ redis,$method],$ arguments): false;
}
}
只需几行简单的代码,就可以满足上述要求。每次需要操作Redis的时候,只需要先用,然后静态调用,比如:
将应用程序\助手\重新分发作为Rds
class ArticleService
{
公共函数索引(){
Rds:set('文章','测试内容');
$ articles=rds :3360 get(' articles ');
返回$ articles
}
}
变得很方便了吗?
调用控制器中的服务类
经常遇到控制器需要判断请求参数,然后调用不同的服务,每个服务的参数个数不一样。这时,call_user_func_array也可以用来完成这个功能:
命名空间App \ Http \ Controllers
使用应用程序\服务\视频服务;
使用照明\ Http \ Request
类别视频控制器扩展控制器
{
私有静态$服务;
public function __construct()
{
self : $ service=new video ServiCe();
}
公共函数索引(请求$r)
{
$ offset=(int)$ r-get(' page ');
$ size=(int)$ r-get(' size ');
$data=[$offset,$size,$ r-get(' tab ')];
self : ok(call _ user _ func _ array([self : $ service,$r-get('is_admin ')?getAdminVideos ' : ' getuser videos '],$ data));
}
}
在上面的代码中,我需要根据is_admin参数来判断调用VideoService的getAdminVideos和getUserVideos方法,它们接收的参数个数是不一样的
在这一点上,我只需要使用call_user_func_array,然后将参数放入$data中就可以完成调用,代码非常优雅,而且一直在尝试和测试。
08
1972-02
02
2022-09
16
2021-06
16
2021-06
16
2021-06
16
2021-06