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 相关文章推荐
留言板翻页的实现详解
Oct 09 PHP
php zend 相对路径问题
Jan 12 PHP
PHP strtotime函数详解
Dec 18 PHP
php获取url字符串截取路径的文件名和扩展名的函数
Jan 22 PHP
PHP Array交叉表实现代码
Aug 05 PHP
php做下载文件的实现代码及文件名中乱码解决方法
Feb 03 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
解析php session_set_save_handler 函数的用法(mysql)
Jun 29 PHP
php中session与cookie的比较
Jan 27 PHP
php 流程控制switch的简单实例
Jun 07 PHP
PHP实现的同步推荐操作API接口案例分析
Nov 30 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
Apr 05 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中截取字符串支持utf-8
2007/01/18 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
jQuery数据显示插件整合实现代码
2011/10/24 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
理解JavaScript原型链
2016/10/25 Javascript
AngularJS递归指令实现Tree View效果示例
2016/11/07 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
jQuery实现删除li节点的方法
2016/12/06 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
js 作用域和变量详解
2017/02/16 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
详解Vue.directive 自定义指令
2019/03/27 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
python 创建弹出式菜单的实现代码
2017/07/11 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
用python实现刷点击率的示例代码
2019/02/21 Python
详解python:time模块用法
2019/03/25 Python
代码实例讲解python3的编码问题
2019/07/08 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
岗位竞聘书范文
2014/03/31 职场文书
青年志愿者活动总结
2014/04/26 职场文书
爱心捐款活动总结
2015/05/09 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
python中 .npy文件的读写操作实例
2022/04/14 Python