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 相关文章推荐
经典的PHPer为什么被认为是草根?
Apr 02 PHP
用PHP读取和编写XML DOM的实现代码
Feb 03 PHP
php 定界符格式引起的错误
May 24 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
php文件夹与文件目录操作函数介绍
Sep 09 PHP
php生成N个不重复的随机数实例
Nov 12 PHP
ThinkPHP整合百度Ueditor图文教程
Oct 21 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
PHP简单创建压缩图的方法
Aug 24 PHP
PHP递归获取目录内所有文件的实现方法
Nov 01 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
php处理多图上传压缩代码功能
Jun 13 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
手把手教你使用DedeCms的采集的图文教程
2007/03/11 PHP
php使用curl抓取qq空间的访客信息示例
2014/02/28 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
php和html的区别点详细总结
2019/09/24 PHP
JS获取select的value和text值的简单实例
2014/02/26 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
微信小程序loading组件显示载入动画用法示例【附源码下载】
2017/12/09 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
python3模块smtplib实现发送邮件功能
2018/05/22 Python
python3实现猜数字游戏
2020/12/07 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
python实现拼接图片
2020/03/23 Python
django 模版关闭转义方式
2020/05/14 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
教师师德承诺书
2014/03/26 职场文书
法人授权委托书格式
2014/04/08 职场文书
《李时珍夜宿古寺》教学反思
2014/04/09 职场文书
合作经营协议书
2014/04/17 职场文书
师范生求职自荐信
2014/06/14 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
个人事迹材料怎么写
2014/12/30 职场文书
世界遗产的导游词
2015/02/13 职场文书
新郎父母婚礼答谢词
2015/09/29 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android