php getbyname,ThinkPhp框架研究之二 魔术函数 __call | 学步园

在看 TP框架的帮助文档的时候 看到一个很有意思的功能---字段的动态查询

官方是这么描述的

ThinkPHP提供了数据癿劢态查询方法,可以简化你癿查询代码,例如:

$User->where('name="ThinkPHP"')->find();

可以简化为:

$User->getByName('ThinkPHP');

$User->where('email="thinkphp@qq.com"')->find();

第一感觉 是 getBy后面的内容是字段名字 于是乎 就翻开Model类源码去看了看

果不其然..发现了一个 魔术函数 __CALL;

__call 函数是 在用对象访问一个该类不存在的方法时调用的函数

系统会自动把方法名和 参数都传到 __call方法中

TP是这么定义的

/**

+----------------------------------------------------------

* 利用__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','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));

$options['where'] = $field.'=/''.$args[0].'/'';

return $this->find($options);

}else{

throw_exception(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_'));

return;

}

}

仔细阅读代码

它提供了三种方式 如果都不符合直接报错提示

第一种

if(in_array(strtolower($method),array('field','table','where','order','limit','page','having','group','lock','distinct'),true)) {

// 连贯操作的实现

$this->options[strtolower($method)] = $args[0];

return $this;

}

应该能看懂吧...

_call把捕获的方法及其参数传递进来

判断 $method是否在允许的数组中,如果存在 将参数赋给$this->option变量

然后返回 $this对象

这是什么意思?

我测试了一下

代码如下

$Form= M("Form");

$data=$Form->order('id desc')->limit(6)->select();

按照 __call函数 第一种解释就是

$Form->order('id desc') 执行之后

$this->option变量会变成

$this->option['order']='id desc',

然后 会返回$this对象

变成

$this->option['limit']='6',

然后会执行SQL去搜索数据

第二种就是

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);

}

这个的意思就是

如果符合array('count','sum','min','max','avg'),true)

会将参数作为 sql语句的搜索字段 ,如果没有 默认就是 星

也就是 SELECT count(*)|sum(*)|min(*)|max(*)|avg(*) ********返回给数据

第三种就是咱们前面说的

elseif(strtolower(substr($method,0,5))=='getby') {

// 根据某个字段获取记录

$field = parse_name(substr($method,5));

$options['where'] = $field.'=/''.$args[0].'/'';

return $this->find($options);

}

这句代码会将 $User->getby* 中的*作为where 语句的参数来执行

假如说 代码为

$User->getByUsername("siren");

那么 通过__call执行之后形成的语句就是

select * from table where username="siren"

就是这样..如果有错的地方 欢迎提出来..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值