php __call方法使用说明
本文章来给大家介绍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类)有这么一段代码:
<?php
/**
+----------------------------------------------------------
* 利用__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没有任何关系,并不是在鼓吹它的好
本文地址:http://www.phprm.com/mxdx/fs1447.html
转载随意,但请附上文章地址:-)