网站地图    收藏   

主页 > php专栏 > php面向对象 >

php __call方法使用说明 - php面向对象

来源:自学PHP网    时间:2014-11-30 12:29 作者: 阅读:

[导读] 本文章来给大家介绍php __call方法使用说明,有需要学习php __call方法的朋友不防进入参考,相信刚开始接触PHP的童鞋都在参考书上看到过__c...

php __call方法使用说明

本文章来给大家介绍php __call方法使用说明,有需要学习php __call方法的朋友不防进入参考,相信刚开始接触PHP的童鞋都在参考书上看到过__call这个魔法方法,而且也看到了它的应用实例!但是,等你真的开始写代码的时候,你用过它吗!?说实话,我用PHP也有一段时间了,但真的从没将它应用到实际开发中。

先说一下__call 的作用吧:"PHP5 对象新增的一个专用方法 ,这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。"

典型用例,代码如下:

  1. <!--?php  
  2. class MethodTest { 
  3.      public function __call($name$arguments) { 
  4.         echo "Calling object method '$name' " 
  5.              . implode(', '$arguments). "n"
  6.      } 
  7. $obj = new MethodTest; 
  8. $obj--->runTest('in object context'); 

运行结果:Calling object method 'runTest' in object context 

不过,最近终于看到了一个__call在实际开发中的应用,thinkphp作为国内应用比较普遍的框架,在它里面对这个方法应用个人觉得算的上是完美啊!

比如在thinkphp的:lib->think->core->model.class.php文件里面(Model类)有这么一段代码:

  1. /** 
  2.      +---------------------------------------------------------- 
  3.      * 利用__call方法实现一些特殊的Model方法 
  4.      +---------------------------------------------------------- 
  5.      * @access public 
  6.      +---------------------------------------------------------- 
  7.      * @param string $method 方法名称 
  8.      * @param array $args 调用参数 
  9.      +---------------------------------------------------------- 
  10.      * @return mixed 
  11.      +---------------------------------------------------------- 
  12.      */ 
  13.     public function __call($method,$args) { 
  14.         if(in_array(strtolower($method),array('field','table','where','order','limit','page','alias','having','group','lock','distinct'),true)) { 
  15.             // 连贯操作的实现 
  16.             $this-&gt;options[strtolower($method)] =   $args[0]; 
  17.             return $this
  18.         }elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){ 
  19.             // 统计查询的实现 
  20.             $field =  isset($args[0])?$args[0]:'*'
  21.             return $this-&gt;getField(strtoupper($method).'('.$field.') AS tp_'.$method); 
  22.         }elseif(strtolower(substr($method,0,5))=='getby') { 
  23.             // 根据某个字段获取记录 
  24.             $field   =   parse_name(substr($method,5)); 
  25.             $where[$field] =  $args[0]; 
  26.             return $this-&gt;where($where)-&gt;find(); 
  27.         }else
  28.             throw_exception(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); 
  29.             return
  30.         } 
  31.     }  

代码的具体功能,我就不解释了,第一可能我也解释不清楚,第二自己去看一下里面的编程思想还是有很多值的学习的。

说一下他的调用方法,就能看出他的"强大"了,调用代码如下:

  1. $this->dao= M('table');   //快速高性能实例化一个 table 表的模型 
  2. $this->dao->field($field)->where($where)->limit($offset . ',' . $limit)->select();    //设置查询字段,查询条件,设置查询数量,最后执行查询操作。当然返回的就是数据库记录了 

看到"不对劲"了吧,field方法成对象了,where、limit、select方法也成对象了,其实field、where这些方法在 Model类 里面都不存在。正是因为这些方法不存在,所以这个时候__call方法被执行了,然后又会返回$this对象。所以可以实现这种"衔接"写法,一行代码搞了所有的SQL语句。

不再说下去了,就是向大家介绍一个__call方法的实际应用,要想完全理解它还是建议你自己去看thinkphp的源码吧!申明:本人跟thinkphp没有任何关系,并不是在鼓吹它的好

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论