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经典的给图片加水印程序
Dec 06 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
php实现多张图片上传加水印技巧
Apr 18 PHP
解析smarty模板中类似for的功能实现
Jun 18 PHP
PHP实现的sqlite数据库连接类
Dec 12 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
PHP加密解密类实例分析
Apr 20 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
Mar 21 PHP
php使用number_format函数截取小数的方法分析
May 27 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
Nov 12 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
Aug 17 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
Zend Guard一些常见问题解答
2008/09/11 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
2014/05/07 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
JS实现点击下载的小例子
2013/07/10 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
javascript常用的方法整理
2015/08/20 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
简单分析javascript中的函数
2016/09/10 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
jQuery实现腾讯信用界面(自制刻度尺)样式
2017/08/15 jQuery
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
Python 面向对象 成员的访问约束
2008/12/23 Python
python与C互相调用的方法详解
2017/07/14 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
几个Linux面试题笔试题
2016/08/01 面试题
机械工程师求职自我评价
2013/09/23 职场文书
自我鉴定思想方面
2013/10/07 职场文书
工厂厂长岗位职责
2013/11/08 职场文书
迎新晚会主持词
2014/03/24 职场文书
《风筝》教学反思
2014/04/10 职场文书
购房意向书
2014/08/30 职场文书
学校隐患排查制度
2015/08/05 职场文书
暑假打工感想
2015/08/07 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书
分析Python list操作为什么会错误
2021/11/17 Python