18910140161

使用 call_user_func_array 让 PHP 代码变得更加优雅

顺晟科技

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中就可以完成调用,代码非常优雅,而且一直在尝试和测试。

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航