php魔术方法__call的使用


本篇主要简单介绍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中的魔术方法,可以编写相对更加优雅的代码。

文章作者: Xudong Jiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Xudong Jiang !
 上一篇
linux下安装nginx_mysql_php linux下安装nginx_mysql_php
本文分享下安装lnmp环境的详细步骤。欢迎讨论和吐槽。 简单说明 本文是基于Centos 7,于命令行下安装php7+nginx+mysql; 其中php+nginx的安装步骤来自我的好朋友以及是我的前公司开发组组长的分享(很帅技术很强),
2016-01-01
下一篇 
hexo+github建立个人blog hexo+github建立个人blog
本文将根据我的个人博客,给大家分享基于hexo+github建立个人博客的过程。欢迎讨论和吐槽。 完整过程参考链接参考1参考2 建好之后不管是建立自己的博客站还是用已有的博客社区,重点在于坚持创作,坚持学习。
2015-10-17
  目录