PHP自定義框架部分知識點小結(一)php
網絡上有大量優秀的MVC框架可供使用,但自定義框架並非爲了開發一個全面的、終極的MVC框架解決方案,而是將它看做是一個很好的從內部學習PHP的機會,在此過程當中,將會學習面向對象編程和MVC設計模式,並學習到開發中的一些注意事項。html
Web MVC的流程體現以下圖:數據庫
一個典型的Web MVC流程:編程
首先建立好相應的目錄文件設計模式
假設項目名爲XFrame,XFrame目錄下的文件一次爲:瀏覽器
APP 應用目錄網絡
---Home 存放前臺文件框架
----Controller 存放前臺的控制器學習
----Model 存放前臺的模型spa
----View 存放用於展現數據的視圖文件
---Admin 存放後臺文件
----Controller 存放後臺的控制器
----Model 存放後臺的模型
----View 存放用於展現數據的視圖文件
Core 存放核心文件
Config 存放配置文件
Public 存放公共文件
Vendor 存放擴展文件
index.php 入口文件
爲了讓本身在搭建框架時,可以準確找到相應目錄下的文件,一開始就把目錄設置好是很是有必要的。
一、設置好目錄後,第一件事就是先在建立好的入口文件(index.php)中設置如下代碼:
1 <?php 2 3 //增長一個入口常量,用於判斷是否有權限直接進入其它文件 4 define('ACCESS', TRUE); 5 6 //加載初始化類 7 include 'Core/App.class.php'; 8 9 //進入到初始化類 10 //Core\App::run(); 11 \Core\App::run(); //因爲採用命名空間,所以訪問類的時候必須帶上空間
2-一、從入口文件的代碼能夠看出,下一步須要建立的文件是在Core目錄下的App.class.php文件。
1 <?php 2 3 //使用命名空間 4 namespace Core; 5 6 //權限判斷:之後的文件都會用到入口文件所定義的常量‘ACCESS’來判斷 7 if (!defined('ACCESS')) { 8 //非法訪問權限 9 header('Location:/index.php'); 10 die; 11 } 12 13 class App{ 14 //該方法就是入口文件所調用的方法,用於初始化 15 public static function run(){ 16 echo 'success'; 17 }
2-二、當在瀏覽器能看到輸出相應的文字,證實能成功調用該方法,接着就要在App類中定義其它初始化的方法,用來設置字符集、定義目錄常量、設置系統錯誤控制、解釋URL、分發控制器。
設置字符集:
//設置字符集 private static function setCharset(){ header("content-type:text/html;charset=utf-8"); }
定義目錄常量:
//定義目錄常量 private static function setDirConst(){ //設置根目錄常量ROOT_DIR define('ROOT_DIR', str_replace('Core','',str_replace('\\','/',__DIR__))); //定義的目錄常量,建議都加上‘/’ define('CORE_DIR', ROOT_DIR.'Core/'); define('CONFIG_DIR', ROOT_DIR.'Config/'); define('VENDOR_DIR', ROOT_DIR.'Vendor/'); define('APP_DIR', ROOT_DIR.'App/'); define('PUBLIC_DIR', ROOT_DIR.'Public/'); }
設置錯誤控制:
//設定錯誤控制 private static function setSysError(){ //兩種級別:級別顯示,是否顯示 @ini_set('error_reporting', E_ALL); @ini_set('display_errors', 1); }
解釋URL($_REQUEST可以獲取到全部傳值的數據,所以當沒法肯定是POST仍是GET時,用$_REQUEST):
//解釋URL private static function iniURL(){ //獲取三個數據:平臺,控制器,方法 $plat = isset($_REQUEST['p']) ? trim($_REQUEST['p']) : 'Home'; $module = isset($_REQUEST['c']) ? ucfirst(strtolower($_REQUEST['c'])) : 'Index'; $action = isset($_REQUEST['a']) ? $_REQUEST['a'] : 'index'; //這裏用定義常量來保存在URL獲取到的平臺、控制器、方法,由於常量可以供全局使用。 define('PLAT', $plat); //Admin或者Home define('CONTROLLER', $module);//指定控制器或者Index define('ACTION', $action);//指定方法或者index }
分發控制器,並調用方法:
//分發控制器 private static function iniDispatch(){ //拿到對應的平臺,控制器和方法 $module = CONTROLLER . 'Controller'; $action = ACTION; //實例化對應的控制器,而後調用方法 include_once APP_DIR.PLAT.'/Controller/' . CONTROLLER . 'Controller.class.php'; //當前是Core空間,須要轉到對應的控制器空間,空間命名規則:平臺+對應屬性。 //new \Home\Controller\IndexController(); $module = '\\' . PLAT . '\\Controller\\' . $module;//構建一個徹底限定名稱訪問的路徑 $module = new $module; //var_dump($module); $module->$action(); //可變方法 }
最後,在一開始的入口方法run()中調用上面所定義的方法,以達到當入口文件調用方法時,可以讓App.class.php初始化相應的設置:
public static function run(){ self::setCharset();//設置字符集 self::setDirConst();//定義目錄常量 self::setSysError();//設置錯誤控制 self::iniURL();//解析URL self::iniDispatch();//分發控制器和調用方法 }
當上述步驟完成後,便可在APP目錄下的Home目錄下的Controller中建立IndexController.class.php