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实现分页的一个示例
Oct 09 PHP
php header()函数使用说明
Jul 10 PHP
自动把纯文本转换成Web页面的php代码
Aug 27 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
谈谈关于php的优点与缺点
Apr 11 PHP
解析thinkphp中的导入文件标签
Jun 20 PHP
php 地区分类排序算法
Jul 01 PHP
php设置允许大文件上传示例代码
Mar 10 PHP
学习php设计模式 php实现访问者模式(Visitor)
Dec 07 PHP
php实现购物车产品删除功能(2)
Jul 23 PHP
PHP基于GD2函数库实现验证码功能示例
Jan 27 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 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+DBM的同学录程序(4)
2006/10/09 PHP
php 下载保存文件保存到本地的两种实现方法
2013/08/12 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
CI框架常用方法小结
2016/05/17 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
php中的依赖注入实例详解
2019/08/14 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
vuejs移动端实现div拖拽移动
2019/07/25 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
js实现扫雷源代码
2020/11/27 Javascript
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
Python笔试面试题小结
2019/09/07 Python
pycharm-professional-2020.1下载与激活的教程
2020/09/21 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
电气工程及其自动化专业求职信
2014/06/23 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
2015年林业工作总结
2015/05/14 职场文书
走近毛泽东观后感
2015/06/04 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
个人业务学习心得体会
2016/01/25 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书