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 if 想到的些问题
Mar 22 PHP
Mysql中limit的用法方法详解与注意事项
Apr 19 PHP
PHP生成带有雪花背景的验证码
Sep 28 PHP
php中使用cookie来保存用户登录信息的实现代码
Mar 08 PHP
php接口与接口引用的深入解析
Aug 09 PHP
smarty实现多级分类的方法
Dec 05 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
Netbeans 8.2将支持PHP7 更精彩
Jun 13 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
Oct 18 PHP
PHP dirname简单使用代码实例
Nov 13 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代码
2010/08/08 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
初识ThinkPHP控制器
2016/04/07 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
js 金额文本框实现代码
2012/02/14 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
javascript实现的HashMap类代码
2014/06/27 Javascript
Jquery插件easyUi实现表单验证示例
2015/12/15 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
JavaScript动态添加css样式和script标签
2016/07/19 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
浅谈JS中的反柯里化( uncurrying)
2017/08/17 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
python实现矩阵打印
2019/03/02 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
python实现井字棋小游戏
2020/03/04 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
室内设计自我鉴定
2013/10/15 职场文书
小学家长会邀请函
2014/01/23 职场文书
机械操作工岗位职责
2014/08/08 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
青岛海底世界导游词
2015/02/11 职场文书
法律讲堂观后感
2015/06/11 职场文书