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 memcache扩展的三种安装方法
Apr 26 PHP
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
ThinkPHP关联模型操作实例分析
Sep 23 PHP
Destoon实现多表查询示例
Aug 21 PHP
php猴子选大王问题解决方法
May 12 PHP
ThinkPHP数据操作方法总结
Sep 28 PHP
php语言的7种基本的排序方法
Dec 28 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
php支付宝APP支付功能
Jul 29 PHP
thinkPHP5框架分页样式类完整示例
Sep 01 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采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
js setTimeout opener的用法示例详解
2013/10/23 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
原生js结合html5制作小飞龙的简易跳球
2015/03/30 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
Vue.use源码分析
2017/04/22 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
python通过colorama模块在控制台输出彩色文字的方法
2015/03/19 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
详解K-means算法在Python中的实现
2017/12/05 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
python机器人运动范围问题的解答
2019/04/29 Python
python字典一键多值实例代码分享
2019/06/14 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
Django ORM filter() 的运用详解
2020/05/14 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
python工具——Mimesis的简单使用教程
2021/01/16 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
某个公司的Java笔面试题
2016/03/11 面试题
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
大学生毕业求职的自我评价
2013/09/29 职场文书
初中高效课堂实施方案
2014/02/26 职场文书
大学自主招生推荐信
2014/05/10 职场文书
扬尘污染防治方案
2014/06/15 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
党员反腐倡廉学习心得体会
2015/08/15 职场文书
Windows下redis下载、redis安装及使用教程
2021/06/02 Redis
docker-compose部署Yapi的方法
2022/04/08 Servers