本篇主要简单介绍php魔术方法__call的作用,并提供一个应用场景,分享对此方法的使用心得。
欢迎讨论和吐槽。
__call方法简介
为了避免当调用的方法不存在时产生错误,可以使用 __call() 方法。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。详见文档:php魔术方法
__call使用分享
- 使用场景是在做一个活动库的时候,需要提供多个跟活动有关的接口供前段调用,包括获取活动展示的相关信息,活动参与记录,以及活动逻辑处理。
- 设计的时候,活动分为模板活动和特殊活动,接口通过一个通用控制器提供,同一个接口对于不同的模板和不同活动返回数据的含义相近,但是处理各不相同,可以根据参数决定调用接口的时候具体去执行什么样的操作。
- 问题在于扩展的时候,可能出现额外的模板或特殊活动需要特定的接口,专门在控制器中添加此接口并针对去实现显得浪费而且不利于维护。
- 可以在把特殊接口的实现写在特点模板或者特殊活动类内部,然后对外的控制器通过提供call方法实现。这样避免了控制器内不断增多的接口方法,也避免了混乱,形成了公共接口在控制器内,大家一起实现;特殊接口自己实现,通过call调用。
参考代码如下
public function __call($name,$arr) { //获取请求参数 进行业务上的参数判断 ... //根据参数得知此活动应该调用哪个类处理(特殊活动类or某个模板类) $actClassName if(!$actClassName||!class_exists($actClassName)) { //判断类是否存在 //类不存在 返回异常 } $actClass = new $actClassName(); if(!in_array($name,get_class_methods($actClass))) { //判断要请求的方法是可访问,是否存在 //方法不存在 返回异常 } //调用此特定方法 $actClass->$name($params); }分享心得
- 此处控制器不需要管理非通用的接口,而是通过__call丢给实际处理逻辑类让他们自己去找实现方法;
- 合理利用php中的魔术方法,可以编写相对更加优雅的代码。