999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

論述PHP實現MVC框架

2016-06-13 18:08:47張志瑜
科技視界 2016年13期
關鍵詞:頁面數據庫用戶

張志瑜

PHP是時下流行的動態網頁開發語言之一,受到包括FACEBOOK等行業巨頭在內的眾多企業青睞,其實際應用非常之廣。掌握基本的PHP語言有利于計算機專業學生日后從事網站維護管理的需要。然而在實際中,工業生產的潮流已經不甘于使用半成品的CMS(內容管理系統)或者WordPress,而是使用更具個性化的PHP框架來進行快速開發,掌握簡單的幾個函數已經難以處理日益豐富的網站開發維護需要。業界的發展潮流傾向代碼和界面分離的做法使得不僅PHP程序員,甚至連前端的頁面美工也需要對PHP有較為深刻的認識。

主流的PHP框架多數采用MVC框架,MVC框架把網頁請求分為Controller(控制),Model(模型)和View(視圖)三部分,通過減低內容模塊之間的耦合度,從而簡化開發流程和提高代碼復用。用PHP語言來實現MVC框架可以看作是繼PHP語言入門的后續課程和進階,通過實現MVC框架來使得學生對PHP和MySQL數據庫有更加具體和深刻的認識,從建立項目,解決問題中更感性地掌握PHP的用途,比面向過程式的開發更加有趣。雖然現成的MVC框架(Yii,CodeIgniter,CakePHP)為數不少,但是掌握獨自開發一個完整的MVC框架能夠使得開發者更加了解整套框架的運作,也能夠使得開發者更快地掌握運用其他框架開發。

對于使用PHP語言來實現完整的MVC網站框架,需要開發者使用現有的工具解決好不同的類之間的控制和處理。我們大致可以根據右圖提供的思路來建立MVC模型的雛形。雖然沒有專業框架擁有很多處理類(緩存類,安全類,輸入輸出處理類),但是最基本的MVC框架然仍不能想象得過于簡單,很多問題需要我們不斷地思考和解決。

1 獲取用戶請求

用戶發出的網頁請求通過URL來傳遞,傳遞的思路就是把需要訪問的頁面分解成多個$_GET參數(如:http://localhost/account/list,控制類是account,輸出list頁面)。實際上網頁服務器會解析成網站目錄下account目錄下的list頁面。在實際和預設兩者的歧義中,我們考慮使用.htaccess來實現請求的轉化。.htaccess文件是Apache服務器中的一個配置文件,它負責相關目錄下的網絡配置,通過.htaccess文件,可以實現網頁重定向,自定義錯誤頁面,改進文件擴展名,特定用戶訪問權限設置,配置默認文檔等功能。.htaccess建立在網站站點的目錄里而不是在Apache安裝目錄下,它具有分布式配置的方式,在目錄中可以放置一個包含一個或多個指令的文件方式,以及作用于此目錄及其所有子目錄。最普遍的例子是使用一下語句來實現用戶請求的轉義:

REWRITERULE

^(.*)$ INDEX.PHP?URL=$1

經過.htaccess處理之后,PHP會把用戶的請求轉化成$_GET[‘url]變量。最普遍的做法卻存在一個小問題,用戶輸入包含后綴名的完整URL的時候(如http://localhost/account/list.php),PHP則會把list.php作為整體而不把.php作為后綴名看待。后續操作會因為找不到list.php(只有list方法)而報錯。所以我們可以通過小小的修改來對請求進行細化:

REWRITERULE

^([A-ZA-Z0-9\/\-_]+)\.?([A-ZA-Z]+)?$ INDEX.PHP?URL = $1&EXTENSION = $2

經過修改后,PHP會把.php作為$_GET[‘extention]參數,則更有利于后續操作針對不同的后綴名來進行不同的處理。

2 對用戶請求進行分析

無論是使用單個文件或者獨立出一個路由的類,思路都是對$_GET[‘url]進行分析分拆,使用explode_array函數提取不同的部分。再以call_user_func_array()來進行控制類和方法類的調用。除了控制類參數部分和方法類參數部分,其余部分可以數組的方式調用模型類。

$RT = new Router($request);

Session::init();

$controller = $RT->getController();

$controller = new $controller;

$method = $RT->getMethod();

$params = $RT->getParams();

if (empty($params)) {

call_user_func(array($controller, $method));

} else {

call_user_func_array(array($controller, $method), $params);

}

3 控制類的設計

控制類(Controller)是MVC處理模式的主要部分,常用思路是把單一類別的網頁作為類名(例如與用戶有關的可以定義為account類),具體的某個頁面就是類中的方法(例如查看單個用戶的信息,如account類中的profile函數)。我們一般先建立一個名為Controller的抽象類,統一定義初始化函數(__construct())和主函數(index(),某個類的默認頁面),具體的類則通通繼承這個抽象類。

控制類不能簡單的包含模型類(model)和視圖類(view)兩個元素,因為在常用的網站開發中往往需要Session,網頁分頁等支持。所以我們采用流行框架中用到load類的方法。值得一提的是,CodeIgniter不是使用Loader類而是使用指針函數來加載其他類,采用這種方法的話需要額外建立一個全局變量來存儲加載了的類的指針數組。另外還可以額外加載registry類來存儲加載函數,registry類作為控制類的一個元素。解決了存儲加載類,我們則用家里Loader類來加載不同模塊(Session,Input,Output)等。

模型類(Model類)與視圖類(View類)不同,正如上圖所示,模型類(Model類)并不是每個控制類都需要調用的(如只顯示靜態頁面,或者調用緩存頁面),所以通常的做法是把模型類也歸納在Loader類的調用范疇。

視圖類(View類)則是必須包含的元素,因為每個控制類最終目錄都是要通過調用頁面(視圖類,PHP頁面文件)來顯示。View類既可以也歸納為Loader類調用,也可以獨立在Loader類之外。需要開發者考慮調用的時候考慮調用單個PHP頁面還是包含額外的PHP頁面模塊。開發者可以根據設計思路來做出不同的選擇。

abstract class Controller

{

protected $_registry;

protected $load;

public function __construct()

{

$this->_registry = Registry::getInstance();

$this->load = new Load;

}

abstract public function index();

final public function __get($key)

{

if ($return = $this->_registry->$key) {

return $return;

}

return false;

}

}

4 模型類的設計

模型類(Model類)的作用在與對數據進行處理,把數據處理的結果和分析數據返回給視圖類(View類)進行顯示。與控制類(Controller類)相同,我們需要先建立模型的抽象類。主要是對數據庫的加載,眾所周知數據庫對一個動態網頁是多么的重要,所以數據庫的處理我們也必須使用獨立的數據庫類(Database類)。Database類可以是對PDO類的繼承,這樣方便我們快速調整不同的數據庫(MySQL,SQLite等),對于只專注于某種數據庫的應用,我們可以使用其特定的類(如MySQLi類)。

在Database類的方法實現中,我們建議繁瑣的多次SQL操作描述成較為容易理解的操作集合函數。此外我們也可以直接使用現有的ORM庫(如Redbean)來代替Database類,把ORM作為模型類(Model類)的元素。

對象關系映射(Object Relational Mapping,簡稱ORM)是一種為了解決面向對象與關系數據庫存在的互不匹配的現象的技術。 簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關系數據庫中。本質上就是將數據從一種形式轉換到另外一種形式。ORM提供了所有SQL語句的生成,代碼人員遠離了數據庫概念。從一個概念需求(例如一個HQL)映射為一個SQL語句,并不需要什么代價,連1%的性能損失都沒有。真正的性能損失在映射過程中,更具體地講,是在對象實例化的過程中。

abstract class Model

{

protected $_registry;

protected $load;

public function __construct()

{

require_once CONFIG_PATH.'db.php';

$this->db = new Database($CFG['db']);

}

}

5 視圖類的設計

與其說是視圖類(View類),不如說是PHP頁面就更為準確,視圖類(View類)可以看做基本的PHP頁面,控制類(Controller類)調用(require(),require_once())這些頁面進行顯示出最后效果。關鍵是需要對模型類(Model類)產生的數據進行處理在傳遞給View。

在MVC框架的過程中,我們可以使用Output類來輔助視圖語句的輸出,例如把HTML的form代碼拆分成幾個echo()函數。

6 使用現有的PHP庫

我們已經建立一個簡單的MVC框架雛形,而且可以在這個雛形之上不斷的改進和賦予更加高級的特性和框架功能(Cookies,Security等)。我們發現原來很多功能,函數都可以手工去一一打造,然而在快速開發或團隊開發的時候,重復的快發基本的功能模塊,除了加深開發者的基本功之外,對開發幫助不大。我們的框架可以和容易的去調用現有得第三方的PHP庫(如PEAR)。但是我們也需要通過類似于spl_autoload_register()去改進PHP的自動加載函數。

通過對MVC框架的實現,開發者可以加深對PHP語言認識和開拓網站開發的思路。針對于PHP初學者來說,本案例就是一門PHP動態網站開發的進階課程。從中可以學習到PHP語言課學習中很少用到的方法:全局函數,指針函數,類,繼承,抽象類等。也為日后的CodeIgniter等框架的學習打下基礎。

[責任編輯:湯靜]

猜你喜歡
頁面數據庫用戶
大狗熊在睡覺
刷新生活的頁面
保健醫苑(2022年1期)2022-08-30 08:39:14
數據庫
財經(2017年2期)2017-03-10 14:35:35
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
數據庫
財經(2016年15期)2016-06-03 07:38:02
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
如何獲取一億海外用戶
創業家(2015年5期)2015-02-27 07:53:25
主站蜘蛛池模板: 国产午夜无码专区喷水| 亚洲欧美不卡| 国产乱子伦视频三区| 97久久人人超碰国产精品| 国产成人综合久久精品尤物| 国产视频一二三区| 亚洲国产理论片在线播放| 国内精品小视频福利网址| 亚洲无码高清一区| 亚洲男人的天堂久久精品| 免费毛片网站在线观看| 91精品国产福利| 国产精品亚洲一区二区在线观看| 日韩欧美综合在线制服| JIZZ亚洲国产| 亚洲精品自拍区在线观看| 国产小视频a在线观看| 欧美一级高清片欧美国产欧美| 2020国产精品视频| 亚卅精品无码久久毛片乌克兰| 国产18在线播放| 91丝袜美腿高跟国产极品老师| 2020国产精品视频| 精品免费在线视频| 人人艹人人爽| 免费可以看的无遮挡av无码| 亚洲精品波多野结衣| 亚洲欧洲日韩久久狠狠爱| 99青青青精品视频在线| 99精品热视频这里只有精品7| 成人在线欧美| 日本午夜三级| 一区二区三区四区在线| 亚洲天堂日韩在线| 国产在线一二三区| Jizz国产色系免费| 无码视频国产精品一区二区| 一级做a爰片久久免费| 国产不卡一级毛片视频| 特级毛片免费视频| 亚洲高清在线天堂精品| 99re这里只有国产中文精品国产精品| 2021国产在线视频| 国产成+人+综合+亚洲欧美| 国产91小视频| 成人亚洲国产| 精品国产福利在线| 这里只有精品国产| 国产日韩久久久久无码精品| 久久77777| 精品国产黑色丝袜高跟鞋| 国产传媒一区二区三区四区五区| 日韩成人午夜| 婷婷五月在线| 日本精品中文字幕在线不卡| 四虎成人精品在永久免费| 国产高清在线精品一区二区三区| 国产亚洲精品97在线观看| 99久久精品免费看国产免费软件| 欧美精品亚洲精品日韩专区| 久久久久久高潮白浆| 亚洲第一黄色网址| 国产一区二区网站| 亚洲精品视频免费观看| 国产视频资源在线观看| 午夜福利视频一区| 亚洲成人黄色网址| 天堂岛国av无码免费无禁网站 | 五月天综合网亚洲综合天堂网| 免费一级毛片完整版在线看| 国产欧美又粗又猛又爽老| 99re在线观看视频| 91青青草视频在线观看的| 国产微拍一区二区三区四区| 亚洲精品国产精品乱码不卞| 在线看片国产| 国产打屁股免费区网站| 国产91av在线| 亚洲无码视频一区二区三区| 国产丝袜第一页| 91人妻日韩人妻无码专区精品| 国产精品大白天新婚身材|