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新手上路(十二)
Oct 09 PHP
PHP 简单日历实现代码
Oct 28 PHP
ubuntu12.04使用c编写php扩展模块教程分享
Dec 25 PHP
php中hashtable实现示例分享
Feb 13 PHP
PHP中file_exists函数不支持中文名的解决方法
Jul 26 PHP
php获取随机数组列表的方法
Nov 13 PHP
php中将一个对象保存到Session中的方法
Mar 13 PHP
php实现的简单检验登陆类
Jun 18 PHP
PHP实现动态执行代码的方法
Mar 25 PHP
php观察者模式应用场景实例详解
Feb 03 PHP
php框架CodeIgniter主从数据库配置方法分析
May 25 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
Oct 16 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
str_replace只替换一次字符串的方法
2013/04/09 PHP
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
PHP实现转盘抽奖算法分享
2020/04/15 PHP
COM中获取JavaScript数组大小的代码
2009/11/22 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
canvas实现流星雨的背景效果
2017/01/13 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
python 基础教程之Map使用方法
2017/01/17 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
一条命令解决mac版本python IDLE不能输入中文问题
2018/05/15 Python
django框架自定义用户表操作示例
2018/08/07 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
pytorch构建多模型实例
2020/01/15 Python
python不使用for计算两组、多个矩形两两间的iou方式
2020/01/18 Python
HTML5应用之文件上传
2016/12/30 HTML / CSS
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
中专毕业生自我鉴定
2013/11/21 职场文书
应届本科生推荐信范文
2013/12/25 职场文书
教师队伍管理制度
2014/01/14 职场文书
现金出纳岗位职责
2014/03/15 职场文书
道路施工安全责任书
2014/07/24 职场文书
汽车质检员岗位职责
2015/04/08 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书