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
主站蜘蛛池模板: 亚洲午夜福利精品无码不卡| 天天爽免费视频| 色首页AV在线| 免费人成视网站在线不卡| 欧美在线一二区| 国产在线视频欧美亚综合| 一级毛片免费的| 18禁黄无遮挡免费动漫网站| 国产人成乱码视频免费观看| 91精品啪在线观看国产| 一本久道热中字伊人| 日韩在线2020专区| 福利在线免费视频| 激情综合婷婷丁香五月尤物| 一区二区影院| 亚洲无码高清免费视频亚洲| 91九色视频网| 精品夜恋影院亚洲欧洲| 色婷婷电影网| 国产女人在线视频| 亚洲国产日韩视频观看| 国产女人水多毛片18| 久久a毛片| 久久精品亚洲热综合一区二区| 98超碰在线观看| 91在线激情在线观看| 精品无码人妻一区二区| 亚洲色图在线观看| 亚洲高清日韩heyzo| 最新国产麻豆aⅴ精品无| 久久国产精品77777| 国产精品男人的天堂| 69国产精品视频免费| 永久免费AⅤ无码网站在线观看| 亚洲一区二区三区香蕉| 91探花国产综合在线精品| 91无码人妻精品一区二区蜜桃| 国内黄色精品| 91精品国产91欠久久久久| 成人小视频网| 亚洲欧美日韩高清综合678| 97亚洲色综久久精品| 国产成+人+综合+亚洲欧美 | 亚洲无码日韩一区| 午夜国产理论| 日本在线免费网站| 尤物亚洲最大AV无码网站| 又爽又大又黄a级毛片在线视频| 99热在线只有精品| 亚洲天堂久久新| 免费无码网站| 久久久受www免费人成| 日本午夜影院| 99久久无色码中文字幕| 2021国产乱人伦在线播放| 中文字幕一区二区人妻电影| 亚洲第一成年网| 亚洲无码91视频| 无遮挡国产高潮视频免费观看| 91福利一区二区三区| 中文字幕无码av专区久久| 国产精品亚洲精品爽爽| 亚洲香蕉伊综合在人在线| 麻豆AV网站免费进入| 亚洲国产亚综合在线区| 伊伊人成亚洲综合人网7777| 国产成人高清亚洲一区久久| 日韩欧美高清视频| 国产精品不卡永久免费| 在线观看亚洲人成网站| 国产高清国内精品福利| 色偷偷综合网| 91黄色在线观看| 天天摸天天操免费播放小视频| 98超碰在线观看| 国产精品久久自在自2021| 热久久这里是精品6免费观看| 女人爽到高潮免费视频大全| 欧美日本激情| 亚洲日韩精品综合在线一区二区| 国产成人精品一区二区三区| 精品中文字幕一区在线|