「終於快來到框架解析的結尾了,本文將會帶領大家領略框架中的模型以及視圖的奧秘。
」
#在日常開發過程中模型的使用是非常之多的,但是在開發過程只知道如何使用,並不知道內在是如何實現的,模型是不管介面還是後台都會使用到的東西。
關於視圖在前後台分離的大趨勢下,框架存在視圖大多數還是針對於後台開發的使用。
本文也是對框架解讀快到最後階段了,接下來喀喀將帶領大家一起學習關於在框架中Db類別的奧秘。
下圖為喀喀爾提供的腦圖可以根據這個腦圖來閱讀文章。
#在學習模型之前一定要知道的就是DB這個類,這個類別也是對資料庫的操作。
在框架中存在這樣一個設定文件,在這個設定檔裡邊會存在關於資料庫配置的一系列資訊。
在接下來的過程中咔咔也會簡單的建立一個資料庫來做示範。
同樣在框架的核心層存在兩個類,分別為Db類和Model類,這兩個類就是接下來的解析對象。
在解析Db操作類別和其它類別對應關係解刨之前,我們先建立一個資料庫作為演示使用。
先來看看Db類別的資訊。
透過上圖我們可以看到關於Db類別的一部分信息,就是使用Db類別的一些查詢方法。
但來到Db類別的最後可以看到一個熟悉的方法__callStatic
。
這個方法在一直讀喀喀文章的讀者應該已經很是熟悉了,這個方法在門面原始碼解析那一節中進行過深入的了解。
對於這個方法只需要記住的是在呼叫沒有宣告的靜態方法時會進行呼叫。
至於call_user_func_array
這個函數的使用可以理解為,這個方法是內建函數,可以直接呼叫函數運行,也就是可以直接運行方法。
在透過剛剛的檢視Db類別的註解資訊時可以看到Db類別是使用著Connection
這個類,也就是連接資料庫類別。
進入到這個類別裡邊簡單的看一下建構函式即可,至於是怎麼一個運作順序會在下文進行講解。
在框架中操作控制器有兩個大場景,第一中為Db類別操作,第二種就是Model操作。
其中Connection·為連接器,Query為查詢器,Builder為sql產生器,exception為異常類別。
知道了以上的幾個訊息,在接下來的理解過程中會有一定的幫助,在下一節中將會對Db類別庫場景分析。
#先從一個簡單的案例解析,先來看看資料庫的數據。
然後來到控制器寫一個簡單的查詢案例,在建立控制器之前先使用指令進行建立一個測試控制器。
在這個控制器進行簡單的查詢資料。
查詢結果如下
##在這個案例中,可以看到使用的是
Db::query
從上圖可以看到執行存取物件不存在的靜態方法時會執行到
call_user_func_array呼叫回呼函數,並把一個陣列參數當作回呼函數的參數
接著程式碼就會執行到
static::connect()
切換資料庫連線
因為沒有任何繼承,所以會來到本類別的connect這個方法。
在這個類別裡邊首先會回傳結果為資料庫配置資訊。
然後會從組態資訊取得到query
這個索引,最後回傳\think\db\Query
這個字串,這裡一定要注意回傳的是字符串,不是這個類別的實例。
緊接著就會執行到第三步驟建立資料庫連線物件實例,接著裡將會對這一步驟進行解析。
緊接著會來到檔案實際執行的為new \think\db\Query
,最終會傳回執行查詢傳回資料集,回傳資料為傳回object(think\db\Query)
#關於這個$this->connection
是在本類的構造函數進行設定的。
先簡單的看一下這個建構函數,在這個建構函式中直接就設定了connection
這個屬性的值,所以在上圖可以使用。
在這裡執行完成之後就會將傳回的值給從一開始就解析的這個呼叫未宣告的靜態方法會進行呼叫。
其中static::connect()
就是最終回傳的值static::connect() 回傳 object(think\db\Query)
。
所以接下來程式碼會執行到 thinkphp/library/think/db/Query.php 的query方法
#$sql
是Db::query()中傳遞的sql語句,並且執行查詢回傳資料集
最後這段程式碼會執行think\db\connector\Mysql的query方法
接下來來到think\db\connector\Mysql的query方法
在這個方法中主要做了三件事情。
$this->initConnect
初始化資料庫連線$this->PDOStatement->execute( );
執行查詢return $this->getResult($pdo, $procedure);
傳回結果集解析$this->initConnect 初始化資料庫連接
在這個方法中可以看到是進行了一次配置資訊獲取,首先需要明白這個配置資訊是什麼。
這個設定項是在設定檔database中設定的,根據註解提供的資訊可以看到主要是關於主從伺服器設定的。
一般情況下是不會在框架中配置主從資訊的,這裡就不去解析框架是如何實作資料庫的主從配置了。
在這個判斷中在進行了一次判斷目前資料庫連接的id,然後執行了連接資料庫方法。
這個方法最終會回傳object(PDO)#33的一個實例資訊。
$this->PDOStatement->execute();
執行查詢
#第二件事做的就是執行查詢,接下來我們來詳細說明這個到底是如何執行的。
在傳回pdo實例時,將這個實例賦值給了$this->PDOStatement
這個屬性,所以會去PDO類別中執行。
在這裡大家需要明白一件事情就是關於execute這個方法,用來執行傳回多個結果集、多個更新計數或二者組合的語句。
第三件事情傳回結果集
直到這裡就是執行的最後一步就是傳回結果集。
這裡使用的方法都是查詢底層,就在去解析了,在這裡就會回傳最終查詢結果。
最終結果就會回傳至這裡__callStatic
方法,並且傳回給上層的$ res
變數。
直到這裡關於使用Db查詢的執行流程就解析完了, 但是框架給封裝的方法不僅僅只有query,其它的查詢方式可以按照咔咔的這個流程在進行簡單的分析。
最後執行的都會是這一節的最後幾個流程,只是前邊執行會有一點點區別而已。
「堅持學習、堅持寫博、堅持分享是咔咔從業以來一直所秉持的信念。希望在偌大互聯網中咔咔的文章能帶給你一絲絲幫助。我是咔咔,下期見。
”
以上是ThinkPHP資料庫查詢之Db類場景分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!