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执行速率优化技巧小结
Mar 15 PHP
php array_intersect比array_diff快(附详细的使用说明)
Jul 03 PHP
PHP 防注入函数(格式化数据)
Aug 08 PHP
有关PHP中MVC的开发经验分享
May 17 PHP
使用php计算排列组合的方法
Nov 13 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
Jun 22 PHP
如何让搜索引擎抓取AJAX内容解决方案
Aug 25 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
Mar 21 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
php通过各种函数判断0和空
Jul 04 PHP
php提取微信账单的有效信息
Oct 01 PHP
PHP实现单条sql执行多个数据的insert语句方法
Oct 11 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
合作指挥官:孟斯克
2020/03/16 星际争霸
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
php实现分页显示
2015/11/03 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
JS 跳转页面延迟2种方法
2013/03/29 Javascript
javascript通过navigator.userAgent识别各种浏览器
2013/10/25 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
谈谈Jquery ajax中success和complete有哪些不同点
2015/11/20 Javascript
canvas实现钟表效果
2017/02/13 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
2019/06/18 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
微信小程序实现搜索功能
2020/03/10 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
Python爬虫图片懒加载技术 selenium和PhantomJS解析
2019/09/18 Python
python装饰器练习题及答案
2019/11/01 Python
python学生信息管理系统实现代码
2019/12/17 Python
python tkiner实现 一个小小的图片翻页功能的示例代码
2020/06/24 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
房屋改造计划书
2014/01/10 职场文书
女娲补天教学反思
2014/02/05 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
公安个人四风问题对照检查及整改措施
2014/10/28 职场文书
英文自荐信范文
2015/03/25 职场文书
社区活动总结范文
2015/05/07 职场文书
Java内存模型之happens-before概念详解
2021/06/13 Java/Android