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 相关文章推荐
ADODB类使用
Nov 25 PHP
NOT NULL 和NULL
Jan 15 PHP
php 获取远程网页内容的函数
Sep 08 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
深入PHP操作MongoDB的技术总结
Jun 02 PHP
php读取excel文件示例分享(更新修改excel)
Feb 27 PHP
百度实时推送api接口应用示例
Oct 21 PHP
php根据一个给定范围和步进生成数组的方法
Jun 19 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
PHP 计算两个特别大的整数实例代码
May 07 PHP
Laravel+Intervention实现上传图片功能示例
Jul 09 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中的global
2014/08/19 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
javascript实现别踩白块儿小游戏程序
2015/11/22 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
微信小程序8种数据通信的方式小结
2020/02/03 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
[01:28]一分钟告诉你DOTA2 TI9不朽宝藏Ⅱ中有什么!
2019/07/09 DOTA
Python学习资料
2007/02/08 Python
python中list常用操作实例详解
2015/06/03 Python
python中星号变量的几种特殊用法
2016/09/07 Python
python的多重继承的理解
2017/08/06 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
破解安装Pycharm的方法
2018/10/19 Python
python pyheatmap包绘制热力图
2018/11/09 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
2020/01/16 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
BabyBjörn婴儿背带法国官网:BabyBjorn法国
2018/06/16 全球购物
C语言面试题
2013/05/19 面试题
STP的判定过程
2012/10/01 面试题
庆中秋节主题活动方案
2014/02/03 职场文书
护理目标管理责任书
2014/07/25 职场文书
劳模事迹材料范文
2014/12/24 职场文书
2015年入党决心书
2015/02/05 职场文书
外出学习心得体会范文
2016/01/18 职场文书
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
Java的Object类的九种方法
2022/04/13 Java/Android