PHP自定义框架部分知识点小结

Posted Oink

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP自定义框架部分知识点小结相关的知识,希望对你有一定的参考价值。

 php自定义框架部分知识点小结(一)

  网络上有大量优秀的MVC框架可供使用,但自定义框架并不是为了开发一个全面的、终极的MVC框架解决方案,而是将它看作是一个很好的从内部学习PHP的机会,在此过程中,将会学习面向对象编程和MVC设计模式,并学习到开发中的一些注意事项。

  Web MVC的流程体现如下图:

一个典型的Web MVC流程:

  1. Controller截获用户发出的请求;
  2. Controller调用对应的Model;
  3. Model调用DAO(基于PDO操作数据库的封装类)完成状态的读写操作;
  4. Controller把数据传递给View;
  5. View渲染最终结果并呈献给用户。

首先创建好相应的目录文件

假设项目名为XFrame,XFrame目录下的文件一次为:

  APP  应用目录

    ---Home  存放前台文件

         ----Controller  存放前台的控制器

         ----Model    存放前台的模型

         ----View      存放用于展示数据的视图文件

    ---Admin  存放后台文件

         ----Controller  存放后台的控制器

         ----Model    存放后台的模型

         ----View      存放用于展示数据的视图文件

  Core  存放核心文件

  Config  存放配置文件

  Public  存放公共文件

  Vendor  存放扩展文件

  index.php  入口文件

为了让自己在搭建框架时,能够准确找到相应目录下的文件,一开始就把目录设置好是非常有必要的。

 

1、设置好目录后,第一件事就是先在创建好的入口文件(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-1、从入口文件的代码可以看出,下一步需要创建的文件是在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-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

 

以上是关于PHP自定义框架部分知识点小结的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码审计18—PHP代码审计小结

片段中的按钮自定义视图

PHP中call user func()和call_user_func_array()调用自定义函数小结

VSCode自定义代码片段——CSS选择器

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段(vue主模板)