php __call方法使用说明
发布:smiling 来源: PHP粉丝网 添加日期:2014-01-17 11:56:12 浏览: 评论:0
本文章来给大家介绍php __call方法使用说明,有需要学习php __call方法的朋友不防进入参考,相信刚开始接触PHP的童鞋都在参考书上看到过__call这个魔法方法,而且也看到了它的应用实例!但是,等你真的开始写代码的时候,你用过它吗!?说实话,我用PHP也有一段时间了,但真的从没将它应用到实际开发中。
先说一下__call 的作用吧:"PHP5 对象新增的一个专用方法 ,这个方法用来监视一个对象中的其它方法。如果你试着调用一个对象中不存在的方法,__call 方法将会被自动调用。"
典型用例,代码如下:
- <!--?php
- class MethodTest {
- public function __call($name, $arguments) {
- echo "Calling object method '$name' "
- . implode(', ', $arguments). "n";
- }
- }
- $obj = new MethodTest;
- $obj--->runTest('in object context');
运行结果:Calling object method 'runTest' in object context
不过,最近终于看到了一个__call在实际开发中的应用,thinkphp作为国内应用比较普遍的框架,在它里面对这个方法应用个人觉得算的上是完美啊!
比如在thinkphp的:lib->think->core->model.class.php文件里面(Model类)有这么一段代码:
- /**
- +----------------------------------------------------------
- * 利用__call方法实现一些特殊的Model方法
- +----------------------------------------------------------
- * @access public
- +----------------------------------------------------------
- * @param string $method 方法名称
- * @param array $args 调用参数
- +----------------------------------------------------------
- * @return mixed
- +----------------------------------------------------------
- */
- public function __call($method,$args) {
- if(in_array(strtolower($method),array('field','table','where','order','limit','page','alias','having','group','lock','distinct'),true)) {
- // 连贯操作的实现
- $this->options[strtolower($method)] = $args[0];
- return $this;
- }elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){
- // 统计查询的实现
- $field = isset($args[0])?$args[0]:'*';
- return $this->getField(strtoupper($method).'('.$field.') AS tp_'.$method);
- }elseif(strtolower(substr($method,0,5))=='getby') {
- // 根据某个字段获取记录
- $field = parse_name(substr($method,5));
- $where[$field] = $args[0];
- return $this->where($where)->find();
- }else{
- throw_exception(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_'));
- return;
- }
- }
代码的具体功能,我就不解释了,第一可能我也解释不清楚,第二自己去看一下里面的编程思想还是有很多值的学习的。
说一下他的调用方法,就能看出他的"强大"了,调用代码如下:
- $this->dao= M('table'); //快速高性能实例化一个 table 表的模型
- $this->dao->field($field)->where($where)->limit($offset . ',' . $limit)->select(); //设置查询字段,查询条件,设置查询数量,最后执行查询操作。当然返回的就是数据库记录了
看到"不对劲"了吧,field方法成对象了,where、limit、select方法也成对象了,其实field、where这些方法在 Model类 里面都不存在。正是因为这些方法不存在,所以这个时候__call方法被执行了,然后又会返回$this对象。所以可以实现这种"衔接"写法,一行代码搞了所有的SQL语句。
不再说下去了,就是向大家介绍一个__call方法的实际应用,要想完全理解它还是建议你自己去看thinkphp的源码吧!申明:本人跟thinkphp没有任何关系,并不是在鼓吹它的好
Tags: php __call 方法
相关文章
- ·PHP 面向对象 继承(2013-11-14)
- ·PHP面向对象开发——封装关键字(2013-11-14)
- ·php-对象的声名-构造-继承-案例(2013-11-14)
- ·开发大型PHP项目的方法(2013-11-27)
- ·php $$是什么意思(2013-11-28)
- ·几个PHP面向对象小实例(2013-12-08)
- ·关于PHP中的Class的几点个人看法(2013-12-08)
- ·PHP中的面向对象和面向过程(2013-12-08)
- ·PHP5.0中多态性的实现方案浅析(2014-01-14)
- ·PHP中MVC框架之文件入口实例详解(2014-01-16)
- ·PHP autoload实现自动加载类(2014-01-16)
- ·PHP面向对象之旅:static变量与方法(2014-01-17)
- ·php中关于抽象(abstract)类和抽象方法的问题解析(2014-02-10)
- ·PHP Class类与对象学习笔记(2014-02-10)
- ·PHP面向对象开发之魔术函数详解(2014-02-10)
- ·PHP面向对象开发之类的多态详解(2014-02-10)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)