PHP自定義框架部分知識點小結(一)

 PHP自定義框架部分知識點小結(一)php

  網絡上有大量優秀的MVC框架可供使用,但自定義框架並非爲了開發一個全面的、終極的MVC框架解決方案,而是將它看做是一個很好的從內部學習PHP的機會,在此過程當中,將會學習面向對象編程和MVC設計模式,並學習到開發中的一些注意事項。html

  Web MVC的流程體現以下圖:數據庫

一個典型的Web MVC流程:編程

  1. Controller截獲用戶發出的請求;
  2. Controller調用對應的Model;
  3. Model調用DAO(基於PDO操做數據庫的封裝類)完成狀態的讀寫操做;
  4. Controller把數據傳遞給View;
  5. View渲染最終結果並呈獻給用戶。

首先建立好相應的目錄文件設計模式

假設項目名爲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

相關文章
相關標籤/搜索