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 和 HTML
Oct 09 PHP
PHP4实际应用经验篇(2)
Oct 09 PHP
PHP语法速查表
Jan 02 PHP
用php实现批量查询清除一句话后门的代码
Jan 20 PHP
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
yii框架源码分析之创建controller代码
Jun 28 PHP
浅析Apache中RewriteCond规则参数的详细介绍
Jun 30 PHP
php读取文件内容的三种可行方法示例介绍
Feb 08 PHP
PHP中FTP相关函数小结
Jul 15 PHP
PHP实现Unicode编码相互转换的方法示例
Nov 17 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
laravel 时间格式转时间戳的例子
Oct 11 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 compact 通过变量创建数组
2016/11/15 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
PHP接口类(interface)的定义、特点和应用示例
2020/05/18 PHP
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
Js 获取当前日期时间及其它操作实现代码
2021/03/04 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
JS中获取数据库中的值的方法
2013/07/14 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
js中document.write的那点事
2014/12/12 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
浅谈JQ中mouseover和mouseenter的区别
2016/09/13 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
使用Node.js搭建静态资源服务详细教程
2017/08/02 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
python开发之字符串string操作方法实例详解
2015/11/12 Python
简单谈谈python中的多进程
2016/11/06 Python
Ubuntu安装Jupyter Notebook教程
2017/10/18 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
python常用数据重复项处理方法
2019/11/22 Python
CSS3 简写animation
2012/05/10 HTML / CSS
德国家具折扣店:POCO
2020/02/28 全球购物
大学毕业寄语大全
2014/04/10 职场文书
数学教育专业求职信
2014/07/22 职场文书
股东授权委托书范文
2014/09/13 职场文书
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python