ThinkPHP核心類原始碼剖析

2021-07-03 13:42:03 字數 1663 閱讀 2841

分析thinkphp原始碼中的設計模式。

(估計會有點讓你費解)

至於第二部分的內容。我還是先寫成文章吧。 

1,對action類的分析:

**:

(1)indexaction,otheraction表示使用者自己建立的一系列控制器,這些控制器都會繼承於action類。

(2)action,控制基類。他的檔案位址位於:thinkphp/lib/think/core/action.class.php。他的主要 功能為:頁面操作(如位址轉向等,返回ajax等)、檢視控制(如指派變數、渲染模版等)。它的檢視控制的功能又委託於view類來完成。圖中表示出了 action和view是組合關係。action的view屬性用於儲存例項化了的view物件,這裡例項化是在action建構函式中進行,建立物件過 程委託於了think:instance()方法,這是典型的「工廠模式」,think:instance()就是建立物件的工廠。再仔細看看原始碼,會發 現think:instance()原來是乙個專門建立「單例物件」的工廠。view物件其實是個單例,它只會被例項化一次。

(3)view,檢視輸出。檔案位置/lib/think/core/view.class.php 。他的主要功能為輸出控制(指派模版變數,模版內容替換等)、解析模版。具體解析模版的過程委託於其他類的,這裡可選擇是templatethink還是 templatesmarty或者是其他自己新增的模版解析類來完成解析。這裡是乙個「策略模式」。view可以建立單例物件,而且它還有assign方 法用於設定值, get方法使用者獲得值。這是乙個典型的「註冊模式」擁有的特徵。。雖然thinkphp並沒有把view當作登錄檔來用。但是因為view又此特性。 使得我們可以在任何地方訪問和設定模版變數。比如:我們可以在model中設定模版變數,只需要 think:instance("view")->assign("valname","val");也可以用 think:instance("view")->get("name");來獲得action中指派的模版變數。view類的這個特點也許會為我 們以後解決一些特定問題帶來很多幫助。

(4)下面簡單說說模版解析類。thinkphp預設為選擇templatethink作為解析模版的策略。templatethink又會被解析 的過程委託於thinktemplate。 thinktemplate就專門負責解析了。它會先解析xml標籤,再解析標籤。這就是為什麼自定義標籤中reture部分的php語法必須使用php替代語法的原因。因為php的正常語言也有很多。 這會誤導標籤的解析。xml標籤具體的解析方法是委託於特定的taglib庫類的。

2,對model類

**:

(1)viewmodel檢視模型, relationmodel關聯模型,advmodel高階模型這些模型都是繼承於model的。這三個拓展模型的實現,都是通過過載父類的方法。

class yourmodel extends model

}?>

呼叫tomodel方法實現模式切換, 這和單獨使用switchmodel是不一樣的。

(3)db類,功能:對資料庫進行操作。 db類永遠只能例項話它的子類。 因為不管你是用new 還是用getinstance, 它都講傳遞到factory 工廠中生成物件。這個工廠會根據配置檔案,覺得db類到底例項化那個子類, 這就使我們能通過配置檔案來指定資料庫型別。

原始碼基礎 核心類

分別列舉client nameserver broker三個部分的核心類,rocketmq的功能實現跟這些類密不可分。有時間的話,可以一一弄清楚每個類的具體作用。對於生產訊息來說,我們一般接觸的第乙個類就是它。defaultmqproducer producer new defaultmqprodu...

thinkphp原始碼解讀

thinkphp原始碼解讀 thinkphp原始碼的根目錄下是 index.php,是系統預設的 主頁,index.php中首先檢測的是 php執行環境,如果php版本小於 5.3.0則退出執行,定義是否為除錯模式,定義應用目錄,引入入口檔案。thinkphp是整個框架的入口檔案,在thinkphp...

spring security認證原始碼剖析

spring security 和shiro目前最主流的安全框架,很好的保護了系統的安全性。shiro實現的原理和spring security具有異曲同工之妙,學會乙個框架,另乙個框架也會很容易上手。1 spring security流程 usernamepasswordauthenticatio...