代码目录
代码下载:
https://github.com/lpx20181019/php_advanced/tree/master/single_entry
代码框架图
代码调用流程图
index.php
header('Content-Type:text/html; charset=utf8'); require './framework/framework.class.php'; $app = new framework(); $app->runApp();
入口文件不需要手动引入其他文件,而交给框架类,让他去引入需要引入的文件。
framework类
<?php /** * 框架基础类 */ class framework{ public function runApp(){ $this->loadConfig(); //加载配置 $this->registerAutoLoad(); //注册自动加载方法 $this->getRequestParams(); //获得请求参数 $this->dispatch(); //请求分发 } /** * 注册自动加载方法 */ private function registerAutoLoad(){ spl_autoload_register(array($this,'user_autoload')); } /** * 自动加载方法 * $param $class_name string 类名 */ public function user_autoload($class_name){ //定义基础类列表 $base_classes = array( //类名 => 所在位置 'model' => './framework/model.class.php', 'MySQLPDO' => './framework/MySQLPDO.class.php', ); //依次判断 基础类、模型类、控制器类 if (isset($base_classes[$class_name])){ require $base_classes[$class_name]; }elseif (substr($class_name,-5) == 'Model'){ require './application/'.PLATFORM."/model/{$class_name}.class.php"; }elseif (substr($class_name, -10) == 'Controller'){ require './application/'.PLATFORM."/controller/{$class_name}.class.php"; } } /** * 载入配置文件 */ private function loadConfig(){ //使用全局变量保存配置 $GLOBALS['config'] = require './application/config/app.conf.php'; } /** * 获取请求参数,p=平台 c=控制器 a=方法 */ private function getRequestParams(){ //当前平台 define('PLATFORM', isset($_GET['p']) ? $_GET['p'] : $GLOBALS['config']['app']['default_platform']); //得到当前控制器名 define('CONTROLLER', isset($_GET['c']) ? $_GET['c'] : $GLOBALS['config'][PLATFORM]['default_controller']); //当前方法名 define('ACTION', isset($_GET['a']) ? $_GET['a'] : $GLOBALS['config'][PLATFORM]['default_action']); } /** * 请求分发 */ private function dispatch(){ //实例化控制器 $controller_name = CONTROLLER.'Controller'; $controller = new $controller_name; //调用当前方法 $action_name = ACTION . 'Action'; $controller->$action_name(); } }
$GLOBALS['config']是一个自动载入配置文件(包括数据库信息)的变量,在基础模型类里填入数据库信息时可以直接通过$GLOBALS['config']['db']['']的形式写入数据库的信息。
实现效果图(url的变化和不使用框架类的一样):