




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、PHP開發(fā)一個屬于自己MVC框架一、起名: 先給我們的PHP-MVC框架起個名字,叫宇宙無敵框架UniverseInvincibleFrameWork二、實(shí)現(xiàn)功能 1、MVC分層 2、唯一入口 3、關(guān)鍵常量可配置 4、自動載入函數(shù) 5、路由分發(fā) 6、數(shù)據(jù)庫工廠 7、多數(shù)據(jù)支持 8、多項目支持三、詳細(xì)分解如何PHP-MVC框架 1、MVC分層 1)、目錄結(jié)構(gòu)2)、目錄簡介 (1)、Home、Admin是項目名,可以無限擴(kuò)展 (2)、Config是配置文件所在目錄,UniverseInvincibleFrameWork是框架核心文件所在目錄 (3)、Index.php是唯一入口文件 (4)、Hom
2、e目錄下就是標(biāo)準(zhǔn)的Controller、Model、View,另外新增了Service (5)、UniverseInvincibleFrameWork目錄下是核心框架入口類、自動載入類、路由類已經(jīng)數(shù)據(jù)庫文件所在的DB目錄 (6)、DB目錄是數(shù)據(jù)庫相關(guān)操作。比如數(shù)據(jù)庫工廠類,接口規(guī)范類,CURD操作等。 2、唯一入口 1)、采用單一入口模式進(jìn)行項目部署和訪問,無論完成什么功能,一個項目都有一個統(tǒng)一的入口。 2)、只需要引入框架核心文件App.php,然后執(zhí)行該類的方法init(); 3)、框架核心文件源碼:_setHeader(); /載入系統(tǒng)配置文件 $this-_loadSysFile();
3、 /自動載入函數(shù) $this-_setAutoload(); /設(shè)置路由 $this-_setRoute(); /* * 載入系統(tǒng)配置文件 */ private function _loadSysFile() require_once dirname(_FILE_)./Function.php; /1、 require_once dirname(_FILE_)././config/config.php; /2、$GLOBALSconfig config.php的所有內(nèi)容 $GLOBALSconfig = require_once dirname(_FILE_)././config/config
4、.php; /* * 頭 */ private function _setHeader() header(Content-type: text/html; charset=UTF-8); /* * 自動載入函數(shù) */ private function _setAutoload() /自動載入函數(shù) require_once dirname(_FILE_)././UniverseInvincibleFrameWork/Autoload.php; $autoload = new Autoload(); $autoload-register(); /* * 設(shè)置路由 */ private functi
5、on _setRoute() $routeObj = new Route(); $routeObj-parse(); 3、關(guān)鍵常量可配置 1)、誰也不會傻呼呼的到把數(shù)據(jù)庫鏈接信息等配置信息寫死到代碼里,那么就必須有一個配置文件。它定義系統(tǒng)常量,包括但不限于項目名稱、數(shù)據(jù)庫賬號密碼,默認(rèn)應(yīng)用名稱/控制器/方法名等 2)、配置文件還有個好處,定義生長環(huán)境、測試環(huán)境、開發(fā)環(huán)境等不同的參數(shù),可以根據(jù)來訪域名、所在機(jī)器IP等信息來使自動選擇加載不同的系統(tǒng)和數(shù)據(jù)庫配置。 Home, /默認(rèn)加載的控制器 DEFAULT_CONTROLLER = Index, /默認(rèn)加載的方法 DEFAULT_METHOD
6、= index, /默認(rèn)數(shù)據(jù)庫配置 DB_CONFIG = array( DB_TYPE = mysql, DB_HOST = localhost, DB_PORT = 3306, DB_USERNAME = root, DB_PASSWORD =, DB_NAME = db1, ), /默認(rèn)數(shù)據(jù)二配置 DB_CONFIG2 = array( DB_TYPE = mysql, DB_HOST = localhost, DB_PORT = 3306, DB_USERNAME = root, DB_PASSWORD =, DB_NAME = db2, ),); 在Function.php增加一個函
7、數(shù),用來讀取配置文件。?php/* * Created by lixuan-it * User: lane * Date: 15/8/27 * Time: 下午4:17 * E-mail: lixuan868686 * WebSite: */function getConfig($name) return $GLOBALSconfig$name ? : ; 4、自動載入函數(shù) 1)、不用自動載入函數(shù),難道要在代碼里不斷的去include其他的文件嗎? 2)、我們用spl_autoload_register()。從PHP5.1.2引入。摒棄了_autoload()。它的優(yōu)勢是一個項目可以有多個sp
8、l_autoload_register()函數(shù)。使得項目框架、各種插件(LaneWeChat、PHPMailer、PHPEXCEL等)不會相互沖突?phpnamespace UniverseInvincibleFrameWork;/* * 自動載入 * Created by lixuan-it * User: lane * Date: 15/8/27 * Time: 下午3:28 * E-mail: lixuan868686 * WebSite: */class Autoload public function register() spl_autoload_register(array($t
9、his, autoload); public function autoload($className) $pathArr = explode(, $className); $filename = array_pop($pathArr); $dir = implode(DIRECTORY_SEPARATOR, $pathArr); $filename = $dir . / . $filename . .php; if(file_exists($filename) require_once $filename; else exit(Error:.$className. loading Faile
10、d); 5、路由分發(fā) 1)、我們的URL規(guī)則: 2)、所有的URL,都會去執(zhí)行index.php。然后路由的作用的是根據(jù)不同的URL,來執(zhí)行不同的Controller。$methodName(); 6、數(shù)據(jù)庫工廠 1)、大型項目中,我們會用到Mysql、Redis等多種數(shù)據(jù)庫。甚至前期是ACCESS,后期是Mysql/Oracle/SQL SERVER,在切換數(shù)據(jù)庫的過程中,只需要修改一個常量而不需要修改代碼。 2)、根據(jù)配置文件中定義的數(shù)據(jù)庫類型,我們選在加載不同的數(shù)據(jù)庫類?phpnamespace UniverseInvincibleFrameWorkDB;/* * 數(shù)據(jù)工廠 * Crea
11、ted by lixuan-it * User: lane * Date: 15/8/27 * Time: 下午3:29 * E-mail: lixuan868686 * WebSite: */class Db public static function factor($dbConfigKey=DB_CONFIG) /根據(jù)參數(shù)選擇加載不同的數(shù)據(jù)庫配置 $dbType = strtolower(getConfig($dbConfigKey)DB_TYPE); switch($dbType) case mysql: $className = Mysql; break; default: exit
12、(Error:Database Type); $className = UniverseInvincibleFrameWorkDB.$className; return new $className($dbConfigKey); 3)、項目中的Model文件,繼承Model類。該類定義了常用的數(shù)據(jù)庫操作,是所有數(shù)據(jù)庫的抽象類。如增刪改查和自定義SQL等。該類使用數(shù)據(jù)工廠中返回的示例,來操作具體的數(shù)據(jù)庫類。_db) if(is_null($this-dbConfigKey) $this-_db = DB:factor(); else $this-_db = DB:factor($this-dbC
13、onfigKey); return $this-_db; public function close() $this-_getInstance()-close(); public function query($sql) return $this-_getInstance()-query($sql); public function fetchAssoc($resource) return $this-_getInstance()-fetchAssoc($resource); public function select($sql) return $this-_getInstance()-se
14、lect($sql); 4)、最后該編碼數(shù)據(jù)庫實(shí)例類了。已Mysql為例_conn) $this-_connect($dbConfigKey); private function _connect($dbConfigKey=DB_CONFIG) $dbConfig = getConfig($dbConfigKey); $this-_conn = mysqli_connect($dbConfigDB_HOST, $dbConfigDB_USERNAME, $dbConfigDB_PASSWORD, $dbConfigDB_NAME, $dbConfigDB_PORT); public funct
15、ion close() mysqli_close($this-_getInstance(); public function query($sql) $result = mysqli_query($this-_conn, $sql); return $result; public function fetchAssoc($resource) $rowList = array(); while($row = mysqli_fetch_assoc($resource) $rowList = $row; return $rowList; public function select($sql) $r
16、esult = $this-query($sql); $rowList = $this-fetchAssoc($result); return $rowList; 5)、補(bǔ)充一點(diǎn)。我們有一個接口類,為了約定各個數(shù)據(jù)庫的實(shí)例類的規(guī)范,他們都要實(shí)現(xiàn)幾個關(guān)鍵方法。?phpnamespace UerseInvincibleFrameWorkDB;/* * 數(shù)據(jù)庫實(shí)例類的接口 * Created by lixuan-it * User: lane * Date: 15/8/27 * Time: 下午5:57 * E-mail: lixuan868686 * WebSite: */Interface Db
17、Interface public function close(); public function query($sql); public function fetchAssoc($resource); public function select($sql); 7、多數(shù)據(jù)支持 1、項目中,常常會遇到既需要數(shù)據(jù)庫A,又需要數(shù)據(jù)庫B。那就需要多數(shù)據(jù)庫支持。 2、在數(shù)據(jù)庫A中獲得用戶ID列表,在數(shù)據(jù)庫B中根據(jù)用戶ID列表獲得用戶詳細(xì)信息 8、多項目支持 1、框架實(shí)現(xiàn)了多項目支持。比如前臺、后臺、項目三、項目四四、測試 1、我們在項目Home中,進(jìn)行測試。編寫兩個Model文件。第一個是Home/
18、Model/IndexModel.php 來查詢默認(rèn)數(shù)據(jù)庫的Mysql 版本。第二個是Home/ Model / TestModel.php。來查詢數(shù)據(jù)庫2的所有表的名字。query($sql); $result = $this-fetchAssoc($result); return $result; dbConfigKey = DB_CONFIG2; public function getTables() $sql = show tables; $result = $this-query($sql); $result = $this-fetchAssoc($result); return $
19、result; 2、寫一個Server文件。Home/Server/IndexServer.php來調(diào)用剛才寫的兩個Model文件并返回getVersion()0version; return $ret; public static function getTables() $model = new HomeModelTestModel(); $ret = $model-getTables(); return $ret; 3、Home/Controller/IndexController.php編寫4個測試示例。?phpnamespace HomeController;/* * Created by lixuan-it * User: lane * Date: 15/8/27 * Time: 下午4:31 * E-mail: lixuan868686 * WebSite: */class IndexCo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 武漢市蔡甸區(qū)2025屆三年級數(shù)學(xué)第二學(xué)期期末質(zhì)量跟蹤監(jiān)視模擬試題含解析
- 個人工程勞務(wù)合同樣式
- 山西省朔州市朔城區(qū)重點(diǎn)名校2025年初三下學(xué)期三調(diào)考試英語試題文試題含答案
- 金城江區(qū)2024-2025學(xué)年三年級數(shù)學(xué)第二學(xué)期期末考試模擬試題含解析
- 美甲店租賃合同簡易模板
- 四川省南充市重點(diǎn)中學(xué)2024-2025學(xué)年高三下學(xué)期第三次階段檢測試題數(shù)學(xué)試題含解析
- 2025年度供暖合同協(xié)議書
- 版企業(yè)對個人的借款合同
- 電視劇劇本采購合同書
- 鋼管扣件出口代理合同
- RB/T 039-2020檢測實(shí)驗(yàn)室儀器設(shè)備計量溯源結(jié)果確認(rèn)指南
- GB/T 39043-2020游樂設(shè)施風(fēng)險評價危險源
- GB/T 3810.4-2016陶瓷磚試驗(yàn)方法第4部分:斷裂模數(shù)和破壞強(qiáng)度的測定
- GB/T 17213.4-2005工業(yè)過程控制閥第4部分:檢驗(yàn)和例行試驗(yàn)
- 商業(yè)銀行資產(chǎn)負(fù)債管理課件
- 施工班組考核表
- 法理學(xué)-(第五版)完整版ppt全套教學(xué)教程課件(最新)
- GB∕T 34876-2017 真空技術(shù) 真空計 與標(biāo)準(zhǔn)真空計直接比較校準(zhǔn)結(jié)果的不確定度評定
- 2022年鄭州信息科技職業(yè)學(xué)院職業(yè)適應(yīng)性測試模擬試題及答案解析
- 國際五一勞動節(jié)頒獎榮譽(yù)晚會動態(tài)PPT模板
- 全院CRRT護(hù)理技能培訓(xùn)理論考核試題及答案
評論
0/150
提交評論