<?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语句。