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 相关文章推荐
一个简单的域名注册情况查询程序
Oct 09 PHP
php中看实例学正则表达式
Dec 25 PHP
php Ubb代码编辑器函数代码
Jul 05 PHP
基于php冒泡排序算法的深入理解
Jun 09 PHP
php多用户读写文件冲突的解决办法
Nov 06 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
自己写了一个php检测文件编码的函数
Apr 21 PHP
php实现建立多层级目录的方法
Jul 19 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
Jan 08 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 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
转换中文日期的PHP程序
2006/10/09 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
ext form 表单提交数据的方法小结
2008/08/08 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
TypeOf这些知识点你了解吗
2016/02/21 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
js实现返回顶部效果
2017/03/10 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
Python的Django框架中的数据过滤功能
2015/07/17 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
pandas修改DataFrame列名的方法
2018/04/08 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
h5网页水印SDK的实现代码示例
2019/02/19 HTML / CSS
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
师范学院毕业生求职信范文
2013/12/26 职场文书
2014年租房协议书范本
2014/10/30 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
教师工作态度自我评价
2015/03/05 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
Windows中Redis安装配置流程并实现远程访问功能
2021/06/07 Redis
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
2022/05/30 NodeJs