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 相关文章推荐
example1.php
Oct 09 PHP
十天学会php之第八天
Oct 09 PHP
使用PHP socke 向指定页面提交数据
Jul 23 PHP
网页游戏开发入门教程三(简单程序应用)
Nov 02 PHP
PHP图片处理类 phpThumb参数用法介绍
Mar 11 PHP
使用PHP Socket写的POP3类
Oct 30 PHP
PHP实现抓取迅雷VIP账号的方法
Jul 30 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
php7 安装yar 生成docker镜像
May 09 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
Jan 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
一个程序下载的管理程序(三)
2006/10/09 PHP
使用 php4 加速 web 传输
2006/10/09 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
PHP7新功能总结
2019/04/14 PHP
PHP切割汉字的常用方法实例总结
2019/04/27 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
childNodes.length与children.length的区别
2009/05/14 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
JS常用算法实现代码
2016/11/14 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
JS正则表达式完美实现身份证校验功能
2017/10/18 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
JS匿名函数内部this指向问题详析
2019/05/10 Javascript
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
Python THREADING模块中的JOIN()方法深入理解
2015/02/18 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
python中requests库session对象的妙用详解
2017/10/30 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
Python日志处理模块logging用法解析
2020/05/19 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
css3 给页面加个半圆形导航条主要利用旋转和倾斜样式
2014/02/10 HTML / CSS
怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返回 指向字符的指针的函数的指针的数组?
2013/03/19 面试题
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
安全生产责任书
2014/03/12 职场文书
导师推荐信范文
2014/05/09 职场文书
毕业赠语大全
2015/06/23 职场文书
运动会通讯稿50字
2015/07/20 职场文书
提档介绍信范文
2015/10/22 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
shell进度条追踪指令执行时间的场景分析
2022/06/16 Servers
macos系统如何实现微信双开? mac登录两个微信以上微信的技巧
2022/07/23 数码科技