zoukankan      html  css  js  c++  java
  • 关于PHP魔术方法__call的一点小发现

      好久没有上博客园写文章了,今晚终于有点空了,就来写一下昨天的一点小发现。

      我自己所知,C++,Java的面向对象都有多态的特点,而PHP没有,但PHP可以通过继承链方法的重写来实现多态的属性。而魔术方法会在特定情况下被触发,我们也可以对其进行重写。

    ---------------------------------------------------------------------------------------------------------摘抄开始------------------------------------------------------------------------------------------------------

      以下摘自5idev.com:

    __call()(Method overloading)

    为了避免当调用的方法不存在时产生错误,可以使用 __call() 方法来避免。该方法在调用的方法不存在时会自动调用,程序仍会继续执行下去。

    1 function __call(string $function_name, array $arguments)
    2 {
    3     ......
    4 }

    该方法有两个参数,第一个参数 $function_name 会自动接收不存在的方法名,第二个 $args 则以数组的方式接收不存在方法的多个参数。

    ---------------------------------------------------------------------------------------------------------摘抄结束------------------------------------------------------------------------------------------------------

      利用这一个特性,以及PHP的函数call_user_func_array,可以达到类似在控制器内用当前对象调用非继承链里的方法的效果,而我想调用的redis的方法(因为$this比$this->redis多打好多字呢。。。而且think PHP里面的缓存拓展使用起来也很麻烦(lll¬ω¬)  )

      下面贴一下代码:

     1 <?php
     2 namespace HomeController;
     3 use ThinkController;
     4 class BaseController extends Controller {
     5 
     6     protected $redis = null;
     7     /**
     8      * [__construct description]
     9      * 实例化redis
    10      */
    11     public function __construct(){
    12         if (!$this->redis) {
    13             $this->redis = new HomeControllerRedisController();
    14         }
    15         parent::__construct();
    16     }
    17 
    18     /**
    19      * 重写方法重载方便使用redis
    20      * @param  string $method_name 重载的方法名
    21      * @param  array $args        参数
    22      * @return mixed              返回结果
    23      */
    24     public function __call($method_name, $args){
    25         if (method_exists($this->redis, $method_name)) {
    26             return call_user_func_array(array($this->redis, $method_name), $args);
    27         }
    28         parent::__call();
    29     }
    30 }

      写完之后,真的觉得自己分外风骚!不过因为是在think PHP3.2.3框架里面做的,get方法不能调用redis的(但其实可以把redis或者controller类里面的方法改名)虽然不知道这样做会不会有什么隐患或者问题,但我觉得这样做还是很方便的,以后有其他的类,还可以加进去。

      如果代码有什么不足或者错误,请各位指正~谢谢~

  • 相关阅读:
    Python-S9—Day85-ORM项目实战之forms组件以及Modelform补充、跨域请求及应用
    Python-S9——Day84-ORM项目实战之权限、form以及modelform
    拦截导弹简单版
    Disease Manangement 疾病管理
    状压dp
    排列
    位运算笔记
    对拍
    机房vscode使用方法
    区间dp复习 之 tyvj 1198 矩阵连乘
  • 原文地址:https://www.cnblogs.com/trustme326/p/7237047.html
Copyright © 2011-2022 走看看