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 相关文章推荐
PHP5.0对象模型探索之抽象方法和抽象类
Sep 05 PHP
PHP初学者头疼问题总结
Oct 09 PHP
解析将多维数组转换为支持curl提交的一维数组格式
Jul 08 PHP
php获取淘宝分类id示例
Jan 16 PHP
php环境无法上传文件的解决方法
Apr 30 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
php在线解压ZIP文件的方法
Dec 30 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
php中删除、清空session的方式总结
Oct 09 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
php实现保存周期为1天的购物车类
Jul 07 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
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
用PHP实现WEB动态网页静态
2006/10/09 PHP
PHP 金额数字转换成英文
2010/05/06 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
删除重复数据的算法
2006/11/23 Javascript
Javascript----文件操作
2007/01/18 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
python实现代码行数统计示例分享
2014/02/10 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
通过cmd进入python的实例操作
2019/06/26 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
你的自行车健身专家:FaFit24
2016/11/16 全球购物
纯净、自信、100%的羊绒服装:360Cashmere
2021/02/20 全球购物
查询优化的一般准则有哪些
2015/03/08 面试题
MySQL面试题
2014/01/12 面试题
餐饮加盟计划书
2014/01/10 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
通信工程专业求职信
2014/06/04 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
骨干教师申报材料
2014/12/17 职场文书
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫
Nginx报错104:Connection reset by peer问题的解决及分析
2022/07/23 Servers