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 相关文章推荐
PHPLog php 程序调试追踪工具
Sep 09 PHP
收集的二十一个实用便利的PHP函数代码
Apr 22 PHP
php下使用iconv需要注意的问题
Nov 20 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 PHP
phpstorm配置Xdebug进行调试PHP教程
Dec 01 PHP
微信公众平台开发关注及取消关注事件的方法
Dec 23 PHP
PHP读取文件内容的五种方式
Dec 28 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
阿里云的WindowsServer2016上部署php+apache
Jul 17 PHP
ThinkPHP5.1验证码功能实现的示例代码
Jun 08 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
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
php代码书写习惯优化小结
2013/06/20 PHP
解析PHP中$_FILES的使用以及注意事项
2013/07/05 PHP
PHP的PDO常用类库实例分析
2016/04/07 PHP
PHP使用Redis替代文件存储Session的方法
2017/02/15 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
python下os模块强大的重命名方法renames详解
2017/03/07 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
马来西亚领先的在线礼品店:Giftr
2018/08/23 全球购物
应用服务器有那些
2012/01/19 面试题
有针对性的求职自荐信
2013/11/14 职场文书
网络维护中文求职信
2014/01/03 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
党员组织关系介绍信
2014/02/13 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
旅游安全协议书
2014/04/21 职场文书
体育活动总结范文
2014/05/04 职场文书
效能风暴心得体会
2014/09/04 职场文书
绿色环保倡议书
2015/04/28 职场文书
白银帝国观后感
2015/06/17 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript