正確理解PHP開發(fā)MVC模型
PHP開發(fā)MVC模型對(duì)于初學(xué)者來說還是不太了解其中的含義。我們?cè)谖恼轮性敿?xì)講述了PHP開發(fā)MVC模型的具體方法,希望對(duì)大家有所幫助。#t#
使用MVC讓程序多了很多數(shù)據(jù)庫操作,使得性能下降,這著實(shí)讓我吃了一驚。MVC只是一種框架,與數(shù)據(jù)庫操作沒有任何關(guān)系。MVC只是提供一種清晰的編程開發(fā)模式,只要你處理的好,是不可能多處很多無謂的數(shù)據(jù)庫操作的。如果一個(gè)MVC讓一個(gè)程序員在不知情的情況下多出了很多數(shù)據(jù)庫操作就絕對(duì)不是一個(gè)很好的MVC架構(gòu)。我覺得MVC只要提供一個(gè)簡(jiǎn)單的開發(fā)框架就行了,沒有必要集成很多庫類,庫類***能讓程序員自己選擇去使用。
我沒有深入研究過MVC的理論,對(duì)我個(gè)人來說,模型就是一個(gè)數(shù)據(jù)庫的封裝,調(diào)用模型的方法,你可以得到相應(yīng)的數(shù)據(jù),但實(shí)現(xiàn)的細(xì)節(jié)程序員不需要關(guān)心。在實(shí)際開發(fā)中,很可能一個(gè)數(shù)據(jù)庫的表就對(duì)應(yīng)一個(gè)模型。
比如說一個(gè)用戶信息表userinfo,對(duì)應(yīng)就有一個(gè)模型user,通過調(diào)用模型user的add()方法你就可以向數(shù)據(jù)庫添加一條數(shù)據(jù),通過select()你就可以實(shí)現(xiàn)查詢,通過update就能實(shí)現(xiàn)更新。同時(shí)模型應(yīng)該是和具體的數(shù)據(jù)庫類型無關(guān)的,無論你使用的mysql,oracle還是sql server。
同時(shí)我不推薦在WEB開發(fā)中使用ROR,復(fù)雜的多表查詢使用SQL語言是多么方便和快捷的事情,而且性能更好。如果一個(gè)程序員連SQL的知識(shí)都沒有,我不認(rèn)為他是一個(gè)合格的程序員。所以,我在我的模型里面,提供了一個(gè)query的方法來實(shí)現(xiàn)直接的SQL查詢。
下面是PHP開發(fā)MVC模型的一個(gè)大概結(jié)果。不是完整代碼,完整代碼請(qǐng)見demo包。
- < ?
- class module{
- var $mysql;//數(shù)據(jù)庫操作類,
可以是mysql,oracle,sql等等- var $tbname;//模型對(duì)應(yīng)的表名稱
- var $debug=false;//是否是調(diào)試模式
- function module($tbname,$db=''){}
//構(gòu)造函數(shù)- function _setDebug($debug=true){}
- //開啟或者關(guān)閉調(diào)試模式
- function add($row,$tbname=''){}
- //新增加一條記錄
- function query($strsql){}//直接查詢sql語句
- function count($where='',$tbname=''){ }
- //計(jì)數(shù)統(tǒng)計(jì)
- function select($where='',$tbname=''){}
- //查詢
- function delete($where='',$tbname=''){}
- //刪除滿足條件的一個(gè)記錄
- function update($set,$where,$tbname=''){}
- //更新指定記錄
- function detail($where,$tbname=''){}
- //詳細(xì)顯示一條記錄
- }
- ?>
在這個(gè)模型里面,我是使用數(shù)組和數(shù)據(jù)庫的字段來對(duì)應(yīng)的。早期的PHPBEAN里面使用了對(duì)象來對(duì)應(yīng)。但后來感覺這種PHP開發(fā)MVC模型的方法在PHP中不好,而且增加了很多無謂的類。使用數(shù)組更加方便,效果更好(PHP中的數(shù)組的確是個(gè)好東西,相對(duì)JAVA來說好太多了)。
在下面的demo中,我使用了mysql數(shù)據(jù)庫來演示,其中數(shù)據(jù)庫操作類改自我原來的一個(gè)庫類。
下面,詳細(xì)講解使用demo。^_^
在原來的的包的index.php里面增加
- < ?
- require_once(SITE_PATH.'/
libs/phpbean.class.php');- require_once(SITE_PATH.'/
libs/mysql.class.php');- $phpbean=new phpbean();
- global $phpbean;
- $mysql=new mysql("localhost"
,"****","****","52site");- $phpbean->register('db',$mysql);
- unset($mysql);
- ?>
這段PHP開發(fā)MVC模型代碼主要是把MYSQL注冊(cè)到注冊(cè)器里面,關(guān)于注冊(cè)器的使用的原理,可以看我翻譯的兩篇文章。
然后新建一個(gè)mysqlController.class.php文件,代碼如下:
- < ?
- /**
- * MVC演示demo
- * 僅僅實(shí)現(xiàn)最基本的MVC功能,不包含安全處理
,數(shù)據(jù)過濾,及其他優(yōu)化措施。- * @author:feifengxlq
- * @since:2007-1-24
- * @copyright http://www.phpobject.net/blog/
- */
- class mysqlController
- {
- var $module;
- function mysqlController(){
- require_once(SITE_PATH.'/libs/module.class.php');
- $this->module=new module('52site_siteinfo');
//52site_siteinfo為表名稱- $this->module->query("set names 'gb2312'");
//如果是MYSQL5請(qǐng)加上這句- }
- function indexAction(){
- print_r($this->module->select());//這樣實(shí)現(xiàn)了讀取數(shù)據(jù)
- }
- }
- ?>
上面首先是控制器的構(gòu)造函數(shù)里面,加入一個(gè)模型。然后在indexAction里面調(diào)用模型的方法來顯示數(shù)據(jù)。這樣就實(shí)現(xiàn)了最簡(jiǎn)單的查詢列表。
以后我會(huì)寫一個(gè)具體的demo來說明如何使用PHP開發(fā)MVC模型的其他方法,比如說查詢、更新、增加、分頁列表、多表連查等等。