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 求质素(素数) 的实现代码
Apr 12 PHP
PHP 数组和字符串互相转换实现方法
Mar 26 PHP
php检测图片木马多进制编程实践
Apr 11 PHP
php正则表达式使用的详细介绍
Apr 27 PHP
关于PHP堆栈与列队的学习
Jun 21 PHP
CodeIgniter框架URL路由总结
Sep 03 PHP
php实现模拟post请求用法实例
Jul 11 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
ThinkPHP5+Layui实现图片上传加预览功能
Aug 17 PHP
php设计模式之策略模式应用案例详解
Jun 17 PHP
php实现的生成排列算法示例
Jul 25 PHP
TP3.2.3框架文件上传操作实例详解
Jan 23 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
法压式咖啡之制作法
2021/03/03 冲泡冲煮
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
Node.js与PHP、Python的字符处理性能对比
2014/07/06 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
微信小程序实现城市列表选择
2018/06/05 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
Vue 理解之白话 getter/setter详解
2019/04/16 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
2020/11/04 Javascript
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
Python 专题四 文件基础知识
2017/03/20 Python
python负载均衡的简单实现方法
2018/02/04 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
pandas通过loc生成新的列方法
2018/11/28 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
python异常处理try except过程解析
2020/02/03 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
python读取excel数据并且画图的实现示例
2021/02/08 Python
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
学校先进集体事迹材料
2014/05/31 职场文书
学习党的群众路线教育实践活动心得体会范文
2014/11/03 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
水浒传读书笔记
2015/06/25 职场文书
2015年度考核个人工作总结
2015/10/24 职场文书
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android