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算开始时间到过期时间的相隔的天数
Jan 12 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
php Rename 更改文件、文件夹名称
May 24 PHP
PHP编码规范的深入探讨
Jun 06 PHP
php+ajax实现的点击浏览量加1
Apr 16 PHP
php商品对比功能代码分享
Sep 24 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
Jan 22 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
Jun 02 PHP
PHP扩展安装方法步骤解析
Nov 24 PHP
php将xml转化对象的实例详解
Nov 17 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 radio 单选框获取与保持值的实现代码
2010/05/15 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
详谈PHP编码转换问题
2015/07/28 PHP
php三种实现多线程类似的方法
2015/10/30 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
javascript实现全角与半角字符的转换
2015/01/07 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
Vuejs第八篇之Vuejs组件的定义实例解析
2016/09/05 Javascript
jQuery实现手机版页面翻页效果的简单实例
2016/10/05 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
原生JS实现在线问卷调查投票特效
2017/01/03 Javascript
原生js实现密码输入框值的显示隐藏
2017/07/17 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
js实现简单进度条效果
2020/03/25 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
python入门教程 python入门神图一张
2018/03/05 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
Python实现的建造者模式示例
2018/08/06 Python
用python爬取租房网站信息的代码
2018/12/14 Python
Form表单及django的form表单的补充
2019/07/25 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
Sam’s Club山姆会员商店:沃尔玛旗下高端会员制商店
2017/01/16 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
八年级英语教学反思
2014/01/09 职场文书
客户接待方案
2014/02/26 职场文书
廉政承诺书范文
2015/04/28 职场文书
HttpClient实现表单提交上传文件
2022/08/14 Java/Android