ThinkPHP框架SQL操作鏈?zhǔn)綄?xiě)法原理(淺顯易懂)

下面由thinkphp框架教程欄目給大家介紹thinkphp框架sql操作鏈?zhǔn)綄?xiě)法原理,希望對(duì)需要的朋友有所幫助!

ThinkPHP框架SQL操作鏈?zhǔn)綄?xiě)法原理(淺顯易懂)

引言

大家如果有面試幾次不難發(fā)現(xiàn),雖然國(guó)產(chǎn)的TP一直被人詬病。但是絲毫不能影響它在廣大企業(yè)中的開(kāi)發(fā)受到青睞,強(qiáng)大的社區(qū),暴力實(shí)用詳細(xì)的中文手冊(cè)。有一個(gè)地方相信大家都不陌生,就是他的鏈?zhǔn)綄?xiě)法,鏈?zhǔn)綄?xiě)法的一定程度上簡(jiǎn)化了SQL工作量。OK,是怎么實(shí)現(xiàn)的,那我們從面向?qū)ο笕胧郑治鲦準(zhǔn)綄?xiě)法的實(shí)現(xiàn)原理。

如下語(yǔ)句

$User->limit(10)->where('status=1')->select();

代碼

立即學(xué)習(xí)PHP免費(fèi)學(xué)習(xí)筆記(深入)”;

我們知道,面向?qū)ο蟮姆椒ǎ梢苑祷囟喾N數(shù)據(jù)類型,當(dāng)然,也可以返回對(duì)象自身,所以我們可以利用這個(gè)特性來(lái)實(shí)現(xiàn)

<?php class Test{     private $var = "";     public function Func(){         $this->var?=?"Var?is?change";???????? return?$this; ????}  }  ????$obj?=?new?Test(); ????var_dump($obj); ????var_dump($obj-&gt;Func());

打印出來(lái)的結(jié)果:

object(Test)[1]?? private?'var'?=&gt;?string?''?(length=0) object(Test)[1]?? private?'var'?=&gt;?string?'Var?is?change'?(length=13)

不難發(fā)現(xiàn):我們私有變量發(fā)說(shuō)obj->Func(),執(zhí)行后,返回了一個(gè)帶著$var = “Var is change”的對(duì)象。

$User-&gt;limit(10)-&gt;where('status=1')-&gt;select();

那么這個(gè)語(yǔ)句就不難理解了。 方法執(zhí)行后,傳遞對(duì)象給下個(gè)方法,以此類推。

簡(jiǎn)單的Select()實(shí)現(xiàn)

<?php      class UserModel{         private $field     ="*";          private $tableName ="";                 private $where     ="";                 private $order     ="";                 private $limit     ="";                 function field($field){                     $this->field?=?$field;???????????? ????????return?$this; ????????}???????? ????????function?table($tableName){???????????? ????????$this-&gt;table?=?$tableName;???????????? ????????return?$this; ????????}???????? ????????function?order($order){???????????? ????????$this-&gt;order?=?"ORDER?BY?".$order;???????????? ????????return?$this; ????????}???????? ????????function?where($where){???????????? ????????$this-&gt;where?=?"WHERE?".$where;???????????? ????????return?$this; ????????}???????? ????????function?limit($index,?$limit?=?0){???????????? ????????$this-&gt;limit?=?"LIMIT?".$index;???????????? ????????if($limit){???????????????? ????????$this-&gt;limit.=?",{$limit}"; ????????????}???????????? ????????????return?$this; ????????}???????? ????????function?select(){???????????? ????????if(empty($this-&gt;tableName)){???????????????? ????????$this-&gt;tableName?=?str_replace("Model",?"",?__CLASS__);//如果表名不指定,則獲取類名 ????????????} ????????????$selectSql?="SELECT?{$this-&gt;field}? ?????????????????????????FROM?`{$this-&gt;tableName}`? ?????????????????????????{$this-&gt;where}? ?????????????????????????{$this-&gt;order}? ?????????????????????????{$this-&gt;limit}";? ?????????????????????????//構(gòu)造SQL語(yǔ)句模版串???????????? ?????????????????????????echo?$selectSql;???????????? ?????????????????????????//return?mysql_query($selectSql);??執(zhí)行拼接后的SQL語(yǔ)句 ????????}  ????}  ????$user?=?new?UserModel(); ????$user-&gt;where("`user`?=?1")-&gt;order("`user`?DESC")-&gt;limit(5)-&gt;select();?&gt;

總結(jié)

思路大概就是通過(guò)鏈?zhǔn)讲僮鞣椒ǎoSQL語(yǔ)句的各個(gè)條件賦值,然后到最后一步統(tǒng)一處理SQL語(yǔ)句。這里只是簡(jiǎn)單地實(shí)現(xiàn)下原理,有心的同學(xué)可以對(duì)方法參數(shù)多種類型判斷,更加靈活地賦條件。比如where方法可以傳數(shù)組。然后也可以依照此思路,做例如INSERT(),UPDATE(),DELETE()等等。這里只是拋磚引玉,如果要更加深入了解鏈?zhǔn)綄?xiě)法,也可以看TP源碼。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊14 分享