手先感謝慕課網(wǎng)平臺(tái)能讓我有幸聽到大牛singwa老師的php課程,這套課程對(duì)我的php學(xué)習(xí)之路產(chǎn)生了很大的影響,由于文筆有限,還是分類討論。這一篇的話說一下關(guān)于如何理解MVC框架并去編寫類似于thinkphp結(jié)構(gòu)的自己的框架!
整理思路為singwa老師課程+慕課老師pengcheng<<
MVC架構(gòu)模式分析與設(shè)計(jì)>>所得出的心得。
關(guān)于MVC思想的理解:
singwa老師的課程是基于當(dāng)前主流php框架"thinkPHP"所編寫的CMS文章管理系統(tǒng)。課程中嚴(yán)格利用MVC思想進(jìn)行了編碼規(guī)范,讓學(xué)習(xí)的小伙伴對(duì)MVC思想能有一個(gè)很深的認(rèn)識(shí),對(duì)喜歡PHP的小伙伴入門進(jìn)階很有幫助喲!
說到MVC 姑且將他們叫成 小M 小V 小C吧;
小C是一個(gè)協(xié)調(diào)能力很強(qiáng)的Girl,它的工作是經(jīng)常和 小M 小V進(jìn)行交流交互,當(dāng)然由于她十分外向,所以也和瀏覽器用戶打成一片。
接受到瀏覽器用戶的指令 如果這個(gè)指令里要求小M也參一腳的話!小C就要開始和小M交流咯。此時(shí)小M時(shí)看管著數(shù)據(jù)庫(kù)的大門的,平時(shí)很喜歡小C,這個(gè)時(shí)候?yàn)榱恕皭矍椤彼敢獯蜷_數(shù)據(jù)庫(kù)的大門取出小C需要的東西(數(shù)據(jù)),然后小C很簡(jiǎn)單粗暴的var_dump()一下(輸出數(shù)據(jù)庫(kù)的內(nèi)容),就在這個(gè)時(shí)候,用戶覺得小M給小C的東西太赤裸裸了,不好看的!所以小C就想到了一個(gè)老友
—
小V,小V醉擅長(zhǎng)穿搭了。她也很樂意幫助小C,就幫小C把從小M那里取到的“赤裸裸的數(shù)據(jù)”給美化了一下,然后送給了小C。此時(shí)小C把經(jīng)過美化的“不再赤裸裸的數(shù)據(jù)”送給了用戶,用戶很滿意!
很不擅長(zhǎng)講編這種故事,但是自己還是想嘗試一下,莫噴。
總之在一個(gè)建議的CMS系統(tǒng)中 C負(fù)責(zé)邏輯代碼處理 M負(fù)責(zé)數(shù)據(jù)庫(kù)的交互提取 V負(fù)責(zé)輸出到瀏覽器的模板操作。
關(guān)于PHP框架:
經(jīng)過對(duì)課程的學(xué)習(xí)和研究,對(duì)PHP框架的一些基本原理也慢慢有了自己的認(rèn)識(shí)。當(dāng)然只是認(rèn)識(shí),可能還是會(huì)有錯(cuò)誤的!在這里說幾個(gè)比較重要的點(diǎn)吧。
一、 如何做出一個(gè)這樣的URL鏈接:http://xxx.com/index.php?c=index&a=add
上面是一個(gè)典型的thinkphp所生成的url入口鏈接。那么m為模塊,c為控制器名稱,a為此控制器下的方法名稱。
那么怎么才能實(shí)現(xiàn)在這樣url形式呢?其實(shí)很簡(jiǎn)單 用的就是我們經(jīng)常用到的$_GET[] ,舉個(gè)栗子!按照上述的url形式的話 我們此時(shí)的$_GET[c] 就等于index,$_GET[a]就等于add,此時(shí) 我們就可以這樣去做:
1、創(chuàng)建一個(gè)indexcontroller.php (不一定非要這么寫 可以自己去規(guī)定)
2、打開創(chuàng)建的文件 寫上如下代碼:
class indexController{ public function add(){ echo "hello"; } }
3、可見我們很簡(jiǎn)單的創(chuàng)建了一個(gè)類和一個(gè)類里面的方法 類名為indexController 方法為 add 那么這個(gè)時(shí)候 我們正常情況下如果想執(zhí)行add方法我們會(huì)怎么做呢?說對(duì)了!實(shí)例化對(duì)象,然后 -> 箭頭戳方法就可以了!代碼如下:
$obj=new indexController;$obj->add();
4、好了,那么我們知道怎么去用常規(guī)方法去執(zhí)行這個(gè)類里的方法了,此時(shí)我們要做的就是框架化,把下面代碼寫入傳說中的入口文件 index.php(URL屁股后面帶參數(shù)的文件名 可以為任意文件名 自己改~)!代碼如下:
if(isset($_GET['c']))&&isset($_GET['a']) ){ //如果控制器C A 被設(shè)置了! 那么我們要做的是 包含這個(gè)控制器文件進(jìn)來 require(''..");//這里拼接的形式就是 :目錄/$_GET[c]."Controller.php"; //文件已經(jīng)包含進(jìn)來了 那么可以實(shí)例化這個(gè)文件里的類并使用類里的方法了 $obj= new $_GET[c]."Controller"; $obj->$_GET['a'](); }
5、經(jīng)過上述四步 就能簡(jiǎn)單的實(shí)現(xiàn)一個(gè) 訪問
http://xxx.com/index.php?c=index&a=add 就能輸出一個(gè) hello
6、既然是這樣的話 我們何不在add方法里也寫一條代碼呢?這樣就可以簡(jiǎn)單的實(shí)現(xiàn)V層了。太簡(jiǎn)單了 require("xx.html");搞定!
【PS:上面的純粹是在慕課的編輯器里手打的,沒有經(jīng)過測(cè)試,只是一個(gè)小思路!具體還要對(duì)get到的值進(jìn)行各種字符處理,對(duì)入口文件里寫的代碼進(jìn)行進(jìn)一步封裝就是后面優(yōu)化的事情啦!】
二、實(shí)現(xiàn)M層
大家都知道M層是用來進(jìn)行數(shù)據(jù)庫(kù)操作的,其實(shí)他的實(shí)現(xiàn)方法和C差不多。只不過和C干的事情不一樣而已。還是舉個(gè)栗子!
1、創(chuàng)建一個(gè)NewsModel.php (不一定非要這么寫 可以自己去規(guī)定)
3、封裝數(shù)據(jù)庫(kù)的基本操作類 DB.class.php 增刪改查 根據(jù)ID更 改 查 刪.. 根據(jù) XX更改查刪【這里就不細(xì)寫了,懶】
2、打開創(chuàng)建的文件 寫上如下代碼:
require("DB.class.php");//包含數(shù)據(jù)庫(kù)操作類 這個(gè)可以寫在入口文件喲。這里為了理解就先包含在這里啦!
class NewsModel{ $_db=""; //下面多了一個(gè)構(gòu)造函數(shù) 也就是在實(shí)例化的時(shí)候,自動(dòng)執(zhí)行構(gòu)造函里的方法!構(gòu)建一個(gè)數(shù)據(jù)庫(kù) 操作對(duì)象。 public function __contruct(){ $this->_db=new DB; //實(shí)例化一個(gè)數(shù)據(jù)庫(kù)操作對(duì)象!可以開始大肆的操作數(shù)據(jù)庫(kù)了! } public function add(){ $this->_db->add(); //比如DB類里有一個(gè)add方法!這里就可以調(diào)用到啦!接下來的事情你懂得! } }
3、和控制器曾實(shí)現(xiàn)一樣!實(shí)例化對(duì)象,然后 -> 箭頭戳方法就可以了!代碼如下:
$obj=new NewsModel;$obj->add();
4、好了,那么我們?cè)趺慈ピ贑里去執(zhí)行M的方法呢?還是很簡(jiǎn)單啦!此時(shí)我們要封裝一個(gè)函數(shù) 姑且稱為 D 即
function D($name){ require_once('目錄/'.$name.'Model.php'); $obj = 'new'.$name.'Model()'; //不知道拼接的是否正確 就是實(shí)例化一個(gè)model對(duì)象 return $obj; //返回此對(duì)象 }
5、好了 那么接下來 我們也在 C里執(zhí)行M的方法了!怎么做呢?比如執(zhí)行的是NewsModel下的方法!
$obj=D("News"); D("News")->add(); //這里跳躍性有點(diǎn) 大家往上拉看看newsModel這個(gè)類就明白了!!!
6、就這樣 小C終于了小M勾結(jié)在了一起!
從實(shí)戰(zhàn)課程中 學(xué)到的當(dāng)然不止這些,當(dāng)然這些也是比較基礎(chǔ)的東西,但是自己一個(gè)字一個(gè)字敲出來我覺得還是蠻有意義的!除了關(guān)于建設(shè)自己的php框架和mvc思想的理解外,從課程中還學(xué)到了很多web JS操作的技巧。并且對(duì)ajax異步請(qǐng)求有了更深層次的了解。感謝singwa老師,感謝慕課網(wǎng)。寫完罷工!繼續(xù)去碼代碼看課程咯!
鏈接: https://pan.baidu.com/s/1DO74hGs2ia0g5qTelMQ3VA 提取碼: pgjp 復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦
有關(guān)我們服務(wù)的更多信息,請(qǐng)聯(lián)系項(xiàng)目經(jīng)理
15899750475 楊先生