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 相关文章推荐
PHP中常用数组处理方法实例分析
Aug 30 PHP
PHP 遍历XP文件夹下所有文件
Nov 27 PHP
php 获取一个月第一天与最后一天的代码
May 16 PHP
解析mysql 表中的碎片产生原因以及清理
Jun 22 PHP
ThinkPHP3.1新特性之字段合法性检测详解
Jun 19 PHP
PHP计算一年多少个星期和每周的开始和结束日期
Jul 01 PHP
PHP动态柱状图实现方法
Mar 30 PHP
全新Mac配置PHP开发环境教程
Feb 03 PHP
php实现登陆模块功能示例
Oct 20 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
PHP实现的敏感词过滤方法示例
Mar 06 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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
一个php作的文本留言本的例子(二)
2006/10/09 PHP
PHP cron中的批处理
2008/09/16 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
js闭包的用途详解
2014/11/09 Javascript
JavaScript 学习笔记之基础中的基础
2015/01/13 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
Python查找相似单词的方法
2015/03/05 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
django session完成状态保持的方法
2018/11/27 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
基于keras中的回调函数用法说明
2020/06/17 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
介绍一下RMI的基本概念
2016/12/17 面试题
十八届三中全会感言
2014/03/10 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
三峡导游词
2015/01/31 职场文书
2015年打非治违工作总结
2015/04/02 职场文书
企业团队精神心得体会
2016/01/19 职场文书
PHP中多字节字符串操作实例详解
2021/08/23 PHP
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android