关于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 Home\Controller;
 3 use Think\Controller;
 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 \Home\Controller\RedisController();
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类里面的方法改名)虽然不知道这样做会不会有什么隐患或者问题,但我觉得这样做还是很方便的,以后有其他的类,还可以加进去。

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

时间: 2024-10-24 21:41:29

关于PHP魔术方法__call的一点小发现的相关文章

巧妙的重载魔术方法__call()

工作半年了,感觉这半年学到的东西比大学四年学到的还要多,主要原因是心静下来了,目标也明确了,不会去整天的和游戏纠缠在一起了.大学时候其实也意识到了玩游戏会影响自己的正常学习和工作的,但是一直控制不了自己,还是忍不住经常去玩,没日没夜的玩(本来就是闷骚男,还宅着玩游戏,这也是大学四年只有游戏.左右手,没有女朋友的一个原因了).现在工作了,每天都有任务,看到旁边的牛人们在项目中如鱼得水,就有了赶超他们的想法,于是每天都会给自己一个额外的小任务去学习新的知识,到现在工作有半年了,对以前不熟悉的linu

phpz中的魔术方法__call、__set、__get、__sleep、__invoke、__autoload、__construct、__destruct、__clone、__tostring、__callstatic

PHP5.3新增了一个叫做__invoke的魔术方法,这样在创建实例后,可以直接调用对象. class testClass { public function __invoke { print “hello world”; } } $n = new testClass; $n(); 执行结果为: hello world. 官方示例 class CallableClass { public function __invoke($x) { var_dump($x); } } $obj = new C

php魔术方法__call

__call是魔术方法中的一个,当程序调用到当前类中未声明或没权限调用的方法时,就会调用__call方法 class test {   public function emptyFunc(){     $getArgs = func_get_args();     $funcName = $getArgs[0];     //$params = array_slice($getArgs, 1);     //var_dump($params);  // this is params       

php中的魔术方法__call(),__clone(),__set(),__get()

__call($a,$v),当在类外部调用类中不存在或者不可见(用protected,private修饰)的方法时,会自动调用__call(方法名,数组参数),此时会向改方法传递2个参数,第一个为调用的方法名,第二个为传递的参数放进数组里.__clone()方法在类的对象被克隆时触发.__set($key,$val)在类外部设置类中不存在或者不可见(protected,private修饰)的属性时触发该方法,此时传递2个参数,第一个是属性名,第二个是属性值.__get($key)在类外部获取类中

【自动化测试】robot framwork的一点小发现

我们在搭建完robotframwork框架并开始打开火狐浏览器的时候,总会碰到打不开浏览器的问题.这次,分享一个常见的小问题. 这个问题呢,是因为火狐的版本更新频繁,导致selenium的版本跟不上导致的.当然,解决这个问题,你可以选择降低火狐版本,但是却会给自己造成一定的成本.所以有一个可以解决的方法,就是下载 geckodriver.exe 文件,这个文件有32bit和64bit,请不要下错版本了.下完这个文件之后,将这个文件放在Python的根目录即可.不过记住的是,Python的根目录已

初学者的每天一点小发现

今天做一个网页时,全局样式中设置了a:hover{color:red;},在做一个导航时设置如下属性 .content-top a{color:#000;} 在浏览器中刷新并不会产生悬停链接变为red的效果. 使用chrome浏览器检查元素,没有找到.content-top a:hover 属性,经过一番折腾终于找到查找伪元素的方法,如下图所示:    由此看出由于权重问题,a:hover的属性被层叠掉,添加.content-top a:hover{color:red;}即可产生预期效果.

关于背包问题的一点小发现

众所周知,背包问题很重要. 相信大部分人写的背包都是先枚举的物品,其实部分背包也可以先枚举容积. 例如01背包,在二维未优化时,可以先枚举j,在枚举i,不影响到结果. 还有完全背包(物品有无数个),优化后也可以先枚举j. 其实先枚举i.j本质上都是一样的,需要注意的其实就是在计算这一个状态时,以前的状态必须计算完才可以. 这个发现没有任何作用,真水! 原文地址:https://www.cnblogs.com/yinyuqin/p/11220803.html

魔术方法__clone(), __toString(), __call(), __autoload(), __sleep()和__wakeup()详解

一.魔术方法__clone() <?php class demo{ public $name; public $age; public function __construct($name,$age){ $this -> name = $name; $this -> age = $age; } public function say(){ echo "say".$this->name; } //在克隆对象时自动调用 //作用:可以对新对象的成员属性进行赋值 pu

PHP魔术方法之__call与__callStatic方法

//魔术方法__call /* $method 获得方法名 $arg 获得方法的参数集合 */ class Human { private function t(){ } public function __call($method,$arg){ echo '你想调用我不存在的方法',$method,'方法<br/>'; echo '还传了一个参数<br/>'; echo print_r($arg),'<br/>'; } public static function _