php中autoload的用法总结


Posted in PHP onNovember 08, 2013

PHP中提供了Autoload来帮助我们方便的进行文件的包含,但是autoload并非想象的那样能够处理所有的情况,今天就来记录一下前几天遇到的autoload存在的一些问题。

为什么要使用 Autoload

在PHP中使用类时,我们必须在使用前加载进来,不管是通过 require 的方式还是 include 的方式,但是会有两个问题影响我们做出加载的决定。

首先是不知道这个类文件存放在什么地方,另外一个就是不知道什么时候需要用到这个文件。特别是项目文件特别多时,不可能每个文件都在开始的部分写很长一串的 require ….

在PHP5之后,我们可以通过 __autoload来解决这个问题。 而且在PHP5.1之后,还提供了 spl_autoload_register() 来提供更完善的加载机制。

通过阅读了 Autoloading in PHP 这篇文章,我理解的 Autoload 的加载机制,当通过 new 来实例化一个类时,PHP会通过定义的__autoload 函数加载相应的文件,如果这个类文件使用了 extends 或者 implements 需要用到其他的类文件,php会重新运行 autoload 去进行类文件的查找和加载,如果发生了两次对同一类文件的请求,就会报错。原文作者提供了三个很有趣的例子来说明这个问题,可以通过 这里 下载源码查看。

一般情况下,有很多种方法来解决加载时到相应位置查找文件的方法。用的最多的就是指定特定的命名标准。

Zend的方法

zend推荐了一种最流行的办法,在文件名中包含路径。例如下面的例子:

// Main.class

function __autoload($class_name) {
    $path = str_replace('_', DIRECTORY_SEPARATOR, $class_name);
    require_once $path.'.php';
}

$temp = new Main_Super_Class(); 所有的下划线都会被替换成路径中的分隔符,上例中就会去 Main/Super/Class.php文件

这种方法的缺点是在编码过程中,我们必须明确的知道代码文件应当所处的位置,而且由于

将文件路径硬编码在了类名中,如果需要修改文件夹的结构时,我们必须手工修改所有的类名。

'Include All'方法

如果是在一个开发环境中,并且对于速度不是很在意的话,使用这个方法是非常方便的。通过将所有类文件放在一个或几个特定文件夹中,然后通过遍历的方式查找加载。

例如:

<?php 
  $arr = array ( 
    'Project/Classes', 
    'Project/Classes/Children', 
    'Project/Interfaces' 
  ); 
  foreach($arr as $dir) { 
    $dir_list = opendir($dir); 
    while ($file = readdir($dir_list)) { 
      $path = $dir.DIRECTORY_SEPARATOR.$file; 
      if(in_array($file, array('.', '..')) || is_dir($path)) 
        continue; 
      if (strpos($file, ".class.php")) 
        require_once $path; 
    } 
  } 
?>

关联文件和位置

另外一个方法是在类文件和他的位置之间建立关联的配置文件,例如:

// configuration.php 
array_of_associations = array( 
  'MainSuperClass' = 'C:/Main/Super/Class.php', 
  'MainPoorClass' = 'C:/blablabla/gy.php' 
);

调用的文件
<?php 
  require 'autoload_generated.php'; 
  function __autoload($className) { 
    global $autoload_list; 
    require_once $autoload_list[$className]; 
  } 
  $x = new A(); 
?>

当然,如果文件特别多的时候,维护起来会是一件麻烦事,但是与在类名中硬编码位置,哪个更好呢?

我们当然不希望手工来维护这个列表,那么可以使用自动生成这个文件来实现,这个对应关系的文件可以是php\xml\json等等。原文的作者实现了一个这样的工具,仔细考虑一下的话,这个不是很难实现,原文作者甚至发展了一个小型的 Autoload 框架,值得学习。

PHP 相关文章推荐
phpfans留言版用到的install.php
Jan 04 PHP
PHP 代码规范小结
Mar 08 PHP
PHP的构造方法,析构方法和this关键字详细介绍
Oct 22 PHP
ThinkPHP在新浪SAE平台的部署实例
Oct 31 PHP
PHP中常用的字符串格式化函数总结
Nov 19 PHP
php使用post数组的键值创建同名变量并赋值的方法
Apr 03 PHP
PHP安装memcached扩展笔记
May 28 PHP
PHP数组与对象之间使用递归实现转换的方法
Jun 24 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
Mar 21 PHP
php数组指针函数功能及用法示例
Feb 11 PHP
PHP如何通过date() 函数格式化显示时间
Nov 13 PHP
你真的了解PHP中的引用符号(&)吗
May 12 PHP
PHP用身份证号获取星座和生肖的方法
Nov 07 #PHP
php旋转图片90度的方法
Nov 07 #PHP
提高PHP编程效率的方法
Nov 07 #PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 #PHP
php获取汉字首字母的函数
Nov 07 #PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 #PHP
php cookie使用方法学习笔记分享
Nov 07 #PHP
You might like
上海牌131型七灯四波段四喇叭一级收音机
2021/03/02 无线电
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
js实现ArrayList功能附实例代码
2014/10/29 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
jQuery+PHP星级评分实现方法
2015/10/02 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
详解vue组件基础
2018/05/04 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
Python Trie树实现字典排序
2014/03/28 Python
python实现的希尔排序算法实例
2015/07/01 Python
python读取Excel表格文件的方法
2019/09/02 Python
Python中过滤字符串列表的方法
2020/12/22 Python
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
日语专业求职信
2014/07/04 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
管理者日常工作必备:22条企业管理流程模板!
2019/07/12 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
500字作文之周记
2019/12/13 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
Python OpenCV实现图像模板匹配详解
2022/04/07 Python
vue特效之翻牌动画
2022/04/20 Vue.js