這幾天一直都在鑽研pengcheng大神的自定義mvc,以及他的新聞實例,從中體會mvc的power。再次對pengcheng大神表示崇高的敬意~框架雖然滿大街了,但不妨礙咱們經過構思本身的框架來加深對框架的理解,知其然更要知其因此然。先對pengcheng大神方向上香....鞠躬.php
好吧,不鬧了~進入正題。java
上3節寫了簡單的MVC結構和Smarty的引入。MVC中V咱們能夠藉助Smarty完成它的職能,另外M裏面咱們只是簡單地返回一段數據,C裏面咱們也只是實現自動實例化各種而已。M和C絕對不會就如此簡單。如今讓咱們從一個【新聞實例】來領教controller和model的高招。mysql
原本,各個職能的文件須要有規範地分類。爲了方便,就避免折騰文件路徑的問題了。文件佈局以下:
sql
其中,data文件包括Smarty定義的各個模板文件,smarty文件夾就是存放下載的Smarty.看起來有些凌亂,高手勿噴~數據庫
config.php包含各參數的配置信息(VIEW引擎和DB引擎),打包成數組數組
封裝VIEW引擎
安全
首先,爲了實現視圖職能,定義一個view引擎:VIEW.phpmvc
在這個VIEW類裏面定義了三個方法:框架
方法init,顧名思義,是爲了完成對Smarty的初始化:包括引入Smarty.class.php文件,經過傳入的$viewtype生成smarty類,經過傳入的$config參數(數組)對Smarty的各屬性賦值。函數
方法assign,這裏再次定義assign方法,是爲了把它包裝成共有的靜態方法,方便外部調用(不用再實例化),而且assign方法經過改造以後,能夠把數據打包成數組的形式當作參數傳入新包裝的assign註冊數組裏面的每個值。
方法display,這裏只是爲了把它包裝成共有的靜態方法。
最後,咱們來從新審視一下這個VIEW類的方法,它們都是public static的,便是說,之後咱們在外部調用的時候再也不須要導入smarty.class.php和實例化,直接VIEW::assign()註冊,再VIEW::display()就能夠簡單地實現mvc中的view職能了~
封裝數據庫引擎
因爲咱們的項目須要對數據做保留,須要用到數據庫的增刪改查。咱們又想,可不能夠也封裝一個數據庫引擎,之後須要進行數據庫操做的時候也直接調用靜態方法就OK?
咱們在同樣在類裏定義一個靜態屬性,用來存儲實例化以後的對象。定義各個靜態方法,方便外部直接調用。
我以爲這種方法就像java的抽象類:咱們能夠在裏面定義屬性,定義抽象方法,不須要具體地實現,只須要制定功能而已。但又跟抽象類有些小小的不一樣:外部調用不用new,沒有繼承,方法的具體實現靠一個Init方法new一個類(我稱之爲實現類)。經過本身的靜態屬性來存儲‘實現類’的方法,經過本身的方法來調用類來實現‘實現類’的具體的方法。
打個形象地比喻: 封裝的引擎就像是賣二手車的~定義一個靜態變量接受‘實現類’的各類舊車(方法),而後把舊車(方法)換個嶄新的殼子(包裝成共有的靜態方法public static)出售。
上面的VIEW引擎有Smarty做爲‘實現類’,但是數據庫(DB)引擎沒有,那麼咱們就來定義它的‘實現類’來具現方法。是爲mysql.class.php。至於mysql類的封裝仁者見仁智者見智,怎麼方便就怎麼封裝唄
注:1>引擎裏面不能有輸出語句,MVC思想就是分工分層,因此取得數據以後不能echo,只能return。
2>DB引擎並不表明Model,只是Model的一部分,能夠理解爲Model的工具
到這裏,咱們MVC中,view層搞定,model層暫告一段落。
前幾節中已經瞭解到controller職能是實例化view和model而且調用他們的方法。可是,咱們不在controller裏直接實例化,而是經過定義函數function.php來實例化。function.php已是老熟人了,見圖:
看到這裏或許有朋友會疑問:你這不是在逗我麼?說好的MVC說好的V方法呢?
放心,我不認識猴子,它也請不動哥。V方法已經在Smarty中實現了,初始化Smarty就是初始化View。VIEW引擎取代了V的工做。
封裝啓動引擎
我一再強調此項目乃是pengcheng大神的神來之筆,啓動引擎也是以其名字來命名PC.php。負責導入各文件,完成各引擎的實例化,以及對url傳遞參數的初始化。
這裏封裝一個public方法run統一執行各個private方法完成初始化,提升安全性
接下來,咱們須要封裝一個統一的入口文件,在裏面直接調用run方法
測試一下:
很差意思,忘了定義controller文件了,也是逗了,我認可我是猴子派來的~哈哈
好,這裏更加凸顯了controller的職能,流程是這樣的,從統一的入口文件admin.php進來,調用run初始化了各個引擎方法,接着經過C方法,進入控制層,調用url傳參controller=xxx&method=xxx相應的M和V完成業務。如此,定義一個adminController.class.php文件
裏面只寫一個test方法,測試調用test方法:
測試成功,說明入口文件,控制層和視圖層都是沒問題的。能夠接着往下開發了