1. 框架运行流程
用最通俗最简单的方法来解释一个MVC框架的运行流程: 通过入口文件载入函数库,加载自动加载的类,然后启动框架,启动框架后通过路由解析地址,然后将地址中解析出控制器名称,加载控制器,通过处理控制器的业务逻辑来返回结果
2. 目录结构
3. 入口文件
定义框架目录和核心文件目录等常量,并引入核心文件。
<?php /** * @入口文件 * 1.定义常量 * 2.加载函数库 * 3.启动框架 */ //定义常量 当前框架所在的根目录 define('SRion',realpath('./')); //框架核心文件所在的目录 define('common',SRion.'/common'); //框架的应用目录(项目文件目录) define('APP',SRion.'/App'); /** * 是否开启调试默认 * @default true */ define('DEBUG',true); //如果开启调试模式 就打开php.ini中的错误模式 if(DEBUG){ ini_set('display_errors','On'); }else{ ini_set('display_errors','Off'); } //引入函数库 include common.'/base/function.php'; //引入框架核心文件 include SRion.'/common/kernal.php'; spl_autoload_register('\common\kernal::load'); //启动框架 \common\kernal::run();
4. 函数库与框架核心文件
函数库:在\common\base\目录中创建文件function.PHP 文件中定义我们框架中常用的一些函数或方法
(在这里我先定义了一个输出或打印变量的函数以做示范)
<?php function p($val){ if(is_bool($val)){ var_dump($val); }else if (is_null($val)){ var_dump(NULL); }else{ echo "<pre style='position:relative;z-index: 1000;padding: 10px;border-radius: 5px;background: #F5F5F5;border:1px solid #aaa;font-size: 14px;line-height: 10px;opacity: 0.9;font-family: Microsoft YaHei; '>".print_r($val,true)."</pre>"; } }
框架核心文件(又称内核或基类文件)
在框架的common目录(框架核心目录)中创建基类文件kernal.php,请注意明明空间和代码规范,文件中的run方法是为了测试框架,即启动框架
<?php namespace common; class kernal { public static $classMap = array(); static function run () { p(框架已启动); } }
4. 自动加载类
在核心文件中定义静态方法load(),$class参数在下面会有讲解
<?php namespace common; class kernal { public static $classMap = array(); static function run () { p(框架已启动); $route = new \common\routes(); } static function load ($class) { //自动加载类库 //new /common/route();正常情况需要这样引入 因为这个类还没有引入 所以会触发入口文件中的自动引入方法 //$class = '\common\route.php'; //转化成 kernal.'/common/route.php'; p($class); if(isset($classMap[$class])){ //如果已存在该文件 那么直接调用 return true; }else{ //如果没有 那么出发入口文件自动引入 $class = str_replace('\\','/',$class); //替换目录符号 单独的'\'视为转义 所以用两个 $file = SRion.'/'.$class.'.php'; if(is_file($file)){ //引入 路由文件 include $file; self::$classMap[$class] = $class; }else{ return false; } } } }
当我们需要的类不存在的时候,就会触发入口文件中的这个方法 来调用我们需要自动应用的类,
spl_autoload_register('\common\kernal::load'); //参数为括号内的内容 当我们使用 $class = new \common\kernal::load;时new 后面的类名将作为$class参数传入我们的自动加载类