PHP MVC框架中类的自动加载机制实例分析


Posted in PHP onSeptember 18, 2019

本文实例讲述了PHP MVC框架中类的自动加载机制。分享给大家供大家参考,具体如下:

原文

实现类的自动加载主要使用到了set_include_pathspl_autoload_register函数。

set_include_path用于提前设置好可能会加载的类的路径。

spl_autoload_register用于调用相关自动加载所需类的函数,实现自动载入的功能。

有一点要注意的是:自动加载在实例化类的时候执行,也就是说使用extends继承类的时候,是不会自动加载父类的。

设置目录如下:

PHP MVC框架中类的自动加载机制实例分析

实现自动加载功能相关的文件有:Loader.php,config.php,boot.php,index.php

config.php

<?php
/**
 * Created by PhpStorm.
 * User: koastal
 * Date: 2016/5/15
 * Time: 10:48
 */
define("APP_PATH",__DIR__."/..");
define("Controller_PATH",__DIR__."/../controller");
define("Model_PATH",__DIR__."/../model");
define("View_PATH",__DIR__."/../view");

Loader.php

<?php
/**
 * Created by PhpStorm.
 * User: koastal
 * Date: 2016/5/15
 * Time: 12:03
 */
class Loader
{
  public static function baseLoad()
  {
    require_once("Controller.php");
    require_once("Model.php");
  }
  public static function autoload($class)
  {
    $path = $class.".class.php";
    require_once($path);
  }
}
$include = array(Controller_PATH, Model_PATH,View_PATH);
set_include_path(get_include_path() . PATH_SEPARATOR .implode(PATH_SEPARATOR, $include));
spl_autoload_register(array('Loader', 'autoload'));
Loader::baseLoad();

boot.php

<?php
/**
 * Created by PhpStorm.
 * User: koastal
 * Date: 2016/5/15
 * Time: 12:19
 */
require_once("Loader.php");

index.php

<?php
require_once(__DIR__."/libs/config.php");
require_once(__DIR__."/libs/boot.php");
$obj = new testController();
$obj->show();

经测试,以上代码可用,全文完。

加更

经测试上面的代码,在访问不存在的控制器是会报错,找不到相关类文件。因为我们缺少判断相关类文件是否存在。因此,我们对Loader.php进行优化,首先扫描相关类文件是否存在,如果不存在则报错。

<?php
/**
 * Created by PhpStorm.
 * User: koastal
 * Date: 2016/5/15
 * Time: 12:03
 */
require_once 'config.php';
class Loader
{
  public static function baseLoad()
  {
    require_once("Controller.php");
    require_once("Model.php");
  }
  public static function searchFile($filename,$path)
  {
    $filePath = false;
    $list = scandir($path);
    foreach($list as $file){
      $realPath = $path.DIRECTORY_SEPARATOR.$file;
      if(is_dir($realPath) && $file!='.' && $file!='..'){
        $res = Loader::searchFile($filename,$realPath);
        if($res){
          return $res;
        }
      }elseif($file!='.' && $file!='..'){
        if($file == $filename){
          $filePath = $realPath;
          break;
        }
      }
    }
    return $filePath;
  }
  public static function autoload($class)
  {
    $filename = $class.".class.php";
    $cflag = Loader::searchFile($filename,Controller_PATH);
    $mfalg = Loader::searchFile($filename,Model_PATH);
    $path = false;
    $path = ($cflag != false)? $cflag:$path;
    $path = ($mfalg != false)? $mfalg:$path;
    if($path == false){
      exit("Class Load Failed.");
    }else{
      require_once($path);
    }
  }
}
Loader::baseLoad();
spl_autoload_register(array('Loader', 'autoload'));

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php分页函数
Jul 08 PHP
php和js如何通过json互相传递数据相关问题探讨
Feb 26 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
Nov 07 PHP
php合并数组中相同元素的方法
Nov 13 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
PHP编写简单的App接口
Aug 28 PHP
php技巧小结【推荐】
Jan 19 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
PHP函数积累总结
Mar 19 PHP
Laravel6.18.19如何优雅的切换发件账户
Jun 14 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 #PHP
php实现多站点共用session实现单点登录的方法详解
Sep 18 #PHP
PHP实现批量修改文件名的方法示例
Sep 18 #PHP
php DES加密算法实例分析
Sep 18 #PHP
php实现QQ小程序发送模板消息功能
Sep 18 #PHP
php文件后缀不强制为.php的实操方法
Sep 18 #PHP
php校验公钥是否可用的实例方法
Sep 17 #PHP
You might like
php 过滤危险html代码
2009/06/29 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
PHP利用imagick生成组合缩略图
2016/02/19 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
使用Python生成随机密码的示例分享
2016/02/18 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
简单谈谈python中的多进程
2016/11/06 Python
python 连接各类主流数据库的实例代码
2018/01/30 Python
python使用Tesseract库识别验证
2018/03/21 Python
python单例模式实例解析
2018/08/28 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
利用python计算时间差(返回天数)
2019/09/07 Python
详解CSS3原生支持div铺满浏览器的方法
2018/08/30 HTML / CSS
div或img图片高度随宽度自适应的方法
2020/02/06 HTML / CSS
Bluebella美国官网:英国性感内衣品牌
2018/10/04 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
高中军训感想300字
2014/03/04 职场文书
公司年会搞笑主持词
2014/03/24 职场文书
日化店促销方案
2014/03/26 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
人生感悟经典句子
2019/08/20 职场文书
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
CPU不支持Windows11系统怎么办
2021/11/21 数码科技
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android