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关联链接常用代码
Nov 05 PHP
php读取mysql中文数据出现乱码的解决方法
Aug 16 PHP
ThinkPHP模版引擎之变量输出详解
Dec 05 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
php实现的debug log日志操作类实例
Jul 12 PHP
深入理解PHP JSON数组与对象
Jul 19 PHP
ThinkPHP和UCenter接口冲突的解决方法
Jul 25 PHP
CodeIgniter框架数据库基本操作示例
May 24 PHP
阿里云的WindowsServer2016上部署php+apache
Jul 17 PHP
php语法检查的方法总结
Jan 21 PHP
laravel中Redis队列监听中断的分析
Sep 14 PHP
php实现简单四则运算器
Nov 29 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
PHP变量赋值、代入给JavaScript中的变量
2015/06/29 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
javascript实现日期格式转换
2014/12/16 Javascript
JavaScript中的console.assert()函数介绍
2014/12/29 Javascript
JavaScript中的函数(二)
2015/12/23 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
如何解决webpack-dev-server代理常切换问题
2019/01/09 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
Python遍历目录的4种方法实例介绍
2015/04/13 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
Selenium python时间控件输入问题解决方案
2020/07/22 Python
美国玩具公司:U.S.Toy
2018/05/19 全球购物
土木工程毕业生推荐信
2013/10/28 职场文书
单位消防安全制度
2014/01/12 职场文书
毕业自我鉴定总结
2014/03/24 职场文书
摄影展策划方案
2014/06/02 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
2015入党自传格式范文
2015/06/26 职场文书
Tomcat用户管理的优化配置详解
2022/03/31 Servers