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 相关文章推荐
改进的IP计数器
Oct 09 PHP
关于php mvc开发模式的感想
Jun 28 PHP
php 文本文件的读取效率
Feb 10 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
Codeigniter的dom类用法实例
Jun 26 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
php生成数字字母的验证码图片
Jul 14 PHP
php获取错误信息的方法
Jul 17 PHP
Yii遍历行下每列数据的方法
Oct 17 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 PHP
详解php框架Yaf路由重写
Jun 20 PHP
php校验公钥是否可用的实例方法
Sep 17 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
深入了解php4(2)--重访过去
2006/10/09 PHP
一个比较简单的PHP 分页分组类
2009/12/10 PHP
PHP正确配置mysql(apache环境)
2011/08/28 PHP
Yii rules常用规则示例
2016/03/15 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
js或css文件后面跟参数的原因说明
2010/01/09 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
jQuery+Ajax实现无刷新操作
2016/01/04 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
JavaScript中的一些隐式转换和总结(推荐)
2017/12/22 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
2018/12/29 jQuery
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
python中的错误处理
2016/04/10 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
Python 实现数据结构-循环队列的操作方法
2019/07/17 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
python 实现客户端与服务端的通信
2020/12/23 Python
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
不尊敬老师检讨书范文
2014/11/19 职场文书
城管年度个人总结
2015/02/28 职场文书
导游词之镇江-金山寺
2019/10/14 职场文书
如何利用pygame实现打飞机小游戏
2021/05/30 Python
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
Python echarts实现数据可视化实例详解
2022/03/03 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python