下面小编就为大家分享一篇thinkphp3.2.0 setInc方法源码全面解析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
我们先来看一下setInc的官方示例:
需要一个字段和一个自增的值(默认为1)
我们通过下面这个例子来一步步分析他的底层是怎么实现的:
?服务器端编程语言(专业超文本预处理器的缩写)
命名空间主页\控制器
使用思考\控制器;
类测试控制器扩展控制器{
公共函数测试(){
$ TB _ test=M(' test ');
$ TB _ test-where([' id '=1])-setInc(' test _ number ',2);//每次添加2
dump($ TB _ test-getLastSql());
//string(67)' UPDATE ` TB _ test ` SET ` test _ number `=test _ number 2 WHERE(` id `=1)'
}
}
第一步肯定是要找到setInc方法的源码:
这里我用到了phpstrom全局搜索的方法,找到了setInc是在proj \ ThinkPHP \ Library \ Think \ model。班级。服务器端编程语言(Professional Hypertext Preprocessor的缩写)下
/**
* 字段值增长
* @访问公共
* @ param stringfield字段名
* @ param integerstep增长值
* @返回布尔值
*/
公共函数setInc($field,$step=1) {
返回$this-setField($field,array('exp ',$field .' '.$ step));
}
可以看到这里用到了塞特菲尔德这个方法,然后用经历自定义表达式设置$field=$field $step到这里,我们稍微了解了一点原理。
可是问题又来了setField又是怎么实现的呢?在同个文件下,找到setField方法:
/**
* 设置记录的某个字段值
* 支持使用数据库字段和方法
* @访问公共
* @param string|array $field字段名
* @param字符串美元值字段值
* @返回布尔值
*/
公共函数setField($field,$value='') {
if(is_array($field)) {
$ data=$ field
}否则{
$ data[$ field]=$ value;
}
返回$ this-save($ data);
}
这里我们看到了常用到的救援方法,这里的$ data[$ field]=$ value;其实就是$data['测试编号]=数组(' exp ','测试编号2 ')
接着来看最常用的save方法:
/**
* 保存数据
* @访问公共
* @param mixed $data数据
* @ param array $选项表达式
* @返回布尔值
*/
公共函数保存($data=' ',$options=array()) {
if(empty($data)) {
//没有传递数据,获取当前数据对象的值
如果(!空($this-data)) {
$ data=$ this-data;
//重置数据
$ this-data=array();
}否则{
$ this-error=L(' _ DATA _ TYPE _ INVALID _ ');
返回错误的
}
}
//数据处理
$ data=$ this-_ facade($ data);
//分析表达式
$ options=$ this-_ parse options($ options);
$ PK=$ this-getPk();
如果(!isset($ options[' where ']){
//如果存在主键数据则自动作为更新条件
if(isset($ data[$ PK]){
$ where[$ PK]=$ data[$ PK];
$ options[' where ']=$ where;
unset($ data[$ PK]);
}否则{
//如果没有任何更新条件则不执行
$ this-error=L(' _ OPERATION _ error _ ');
返回错误的
}
}
如果(is _ array($ options[' where '])已设置($ options[' where '][$ PK]){
$ PK value=$ options[' where '][$ PK];
}
if(false===$ this-_ before _ update($ data,$options)) {
返回错误的
}
$result=$this-db-update($data,$ options);
如果(假!==$result) {
if(isset($ PK值))$ data[$ PK]=$ PK值;
$this-_after_update($data,$ options);
}
返回$结果
}
最主要是的$ options=$ this-_ parse options($ options);和$result=$this-db-update($data,$ options);前者把参数转换成用于拼接结构化查询语言的字符串数组,后者调用了proj \ TP test \ ThinkPHP \ Library \ Think \ db。班级。服务器端编程语言(Professional Hypertext Preprocessor的缩写)下的更新方法:
/**
* 更新记录
* @访问公共
* @param mixed $data数据
* @ param array $选项表达式
* @return false |整数
*/
公共函数更新($data,$options) {
$ this-model=$ options[' model '];
$sql='UPDATE '。$ this-parse表($ options[' table '])。$this-parseSet($data)。$this-parseWhere(!空($options['where'])?$options['where']:' ')。$this-parseOrder(!空($options['order'])?$options['order']:' ')。$this-parseLimit(!空($options['limit'])?$options['limit']:' ')。$ this-parse lock(isset($ options[' lock '])?$options['lock']:false)。$this-parseComment(!空($options['comment'])?$ options[' comment ']:' ');
返回$this-execute($sql,$this-parseBind(!空($options['bind'])?$ options[' bind ']:array()));
}
最后其实就是用到了proj \ ThinkPHP \ Library \ Think \ Db \ Driver \ MySQL。班级。服务器端编程语言(Professional Hypertext Preprocessor的缩写)这个驱动类的执行方法。
/**
* 执行语句
* @访问公共
* @ param stringstr SQL指令
* @返回整数|假
*/
公共函数执行($str) {
$ this-init connect(true);
如果(!$this-_linkID)返回错误的
$ this-query str=$ str;
//释放前次的查询结果
if($ this-queryID){ $ this-free();}
N('db_write ',1);
//记录开始执行时间
g('查询开始时间');
$result=mysql_query($str,$ this-_ linkID);
$ this-debug();
if ( false===$result) {
$ this-error();
返回错误的
}否则{
$ this-numRows=MySQL _ affected _ rows($ this-_ linkID);
$ this-lastInsID=MySQL _ insert _ id($ this-_ linkID);
返回$ this-numRows;
}
}
最后用最底层的mysql_query执行结构化查询语言语句。
到此为止,setInc的源码已经大致过了一遍了。想必大家对setInc如何执行也更了解了一点。
以上这篇thinkphp3.2.0 setInc方法源码全面解析就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。