PHP自定义框架部分知识点小结
Posted Oink
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP自定义框架部分知识点小结相关的知识,希望对你有一定的参考价值。
php自定义框架部分知识点小结(一)
网络上有大量优秀的MVC框架可供使用,但自定义框架并不是为了开发一个全面的、终极的MVC框架解决方案,而是将它看作是一个很好的从内部学习PHP的机会,在此过程中,将会学习面向对象编程和MVC设计模式,并学习到开发中的一些注意事项。
Web MVC的流程体现如下图:
一个典型的Web MVC流程:
- Controller截获用户发出的请求;
- Controller调用对应的Model;
- Model调用DAO(基于PDO操作数据库的封装类)完成状态的读写操作;
- Controller把数据传递给View;
- 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自定义框架部分知识点小结的主要内容,如果未能解决你的问题,请参考以下文章