PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解


Posted in PHP onJune 03, 2019

本文实例讲述了PHP从零开始打造自己的MVC框架之类的自动加载实现方法。分享给大家供大家参考,具体如下:

前面介绍了MVC框架的入口文件,接下来我们希望完成一个“自动加载类”的功能,我们把这个功能放到Imooc这个基础类当中。

core\imooc.php:

<?php
namespace core;
class Imooc
{
  public static $classMap = array();
  static public function run()
  {
    p('ok');
    $route = new \core\route();
  }
  /*
  自动加载的功能
  */
  static public function load($class)
  {
    // 自动加载类库
    // new \core\Route()
    // $class = '\core\Route'
    // IMOOC.'/core/route.php'
    if(isset($classMap[$class])){
      return true;
    }else{
      $class = str_replace('\\', '/', $class);
      $file = IMOOC.'/'.$class.'.php';
      if (is_file($file)) {
        include $file;
        self::$classMap[$class] = $class;
      }else{
        return false;
      }
    }
  }
}

上面代码中,load()方法的主要功能就是自动加载类库。

自动加载的工作原理:

当我们new一个类的时候,如果它不存在,就会触发spl_autoload_register注册的方法,然后通过这个方法去引入要实例化的类

spl_autoload_register('\core\Imooc::load');

我们在入口文件index.php中注册:

<?php
/*
入口文件
1.定义常量
2.加载函数库
3.启动框架
*/
// 定义当前框架所在的根目录
define('IMOOC', __DIR__);
// 定义框架核心文件所在的目录
define('CORE', IMOOC.'/core');
// 项目文件所在目录
define('APP', IMOOC.'/app');
// 定义项目调试模式
define('DEBUG', true);
// 判断项目是否处于调试状态
if (DEBUG) {
  // 设置报错级别:显示所有错误
  ini_set('display_error', 'On');
}else{
  ini_set('display_error','Off');
}
// 加载函数库
include CORE.'/common/function.php';
// 加载框架核心文件
include CORE.'/imooc.php';
// 注册自动加载
// (当我们new一个不存在的类的时候会触发\core\Imooc::load)
spl_autoload_register('\core\Imooc::load');
\core\Imooc::run();

所以,我们在run方法实例化route类的时候并没有手动引入该类文件

static public function run()
{
    p('ok');
    $route = new \core\route();
}

上面代码,new \core\route()会触发load()方法,然后去引入需要的文件。

route.php代码如下:

<?php
namespace core;
class Route
{
  public function __construct(){
    p('route ok');
  }
}

现在我们访问入口文件index.php,会调用Imooc::run方法,预期浏览器会输出:

ok
route ok

PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解

至此,项目结构如图:

PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php 遍历数据表数据并列表横向排列的代码
Sep 05 PHP
php 格式化数字的时候注意数字的范围
Apr 13 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 PHP
php轻量级的性能分析工具xhprof的安装使用
Aug 12 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
Apr 14 PHP
PHP查询大量数据内存耗尽问题的解决方法
Oct 28 PHP
利用php做服务器和web前端的界面进行交互
Oct 31 PHP
PHP 中魔术常量的实例详解
Oct 26 PHP
PHP 访问数据库配置通用方法(json)
May 20 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
Jun 03 #PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 #PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 #PHP
PHP使用ActiveMQ实现消息队列的方法详解
May 31 #PHP
php中的buffer缓冲区用法分析
May 31 #PHP
PHP实现基于状态的责任链审批模式详解
May 31 #PHP
Laravel框架实现调用百度翻译API功能示例
May 30 #PHP
You might like
php下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
CI框架中集成CKEditor编辑器的教程
2014/06/09 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
Javascript 获取链接(url)参数的方法
2009/02/15 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
js 中将多个逗号替换为一个逗号的代码
2014/06/07 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
基于Bootstrap3表格插件和分页插件实例详解
2016/05/17 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
WxPython建立批量录入框窗口
2019/02/27 Python
python使用Plotly绘图工具绘制散点图、线形图
2019/04/02 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
python的re模块使用方法详解
2019/07/26 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
在python中求分布函数相关的包实例
2020/04/15 Python
python用什么编辑器进行项目开发
2020/06/17 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
中介公司区域经理岗位职责范本
2014/03/02 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
预备党员学习十八届三中全会精神思想汇报
2014/09/13 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2016年父亲节寄语
2015/12/04 职场文书
大学生干部培训心得体会
2016/01/06 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang