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 相关文章推荐
使用无限生命期Session的方法
Oct 09 PHP
PHP的面试题集,附我的答案和分析(一)
Nov 19 PHP
简单示例AJAX结合PHP代码实现登录效果代码
Jul 25 PHP
ThinkPHP php 框架学习笔记
Oct 30 PHP
利用php实现禁用IE和火狐的缓存问题
Dec 03 PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 PHP
PHP文件大小格式化函数合集
Mar 10 PHP
php根据某字段对多维数组进行排序的方法
Mar 07 PHP
php实现二进制和文本相互转换的方法
Apr 18 PHP
PHP检测用户语言的方法
Jun 15 PHP
thinkPHP5.0框架简单配置作用域的方法
Mar 17 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 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函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
PHP空值检测函数与方法汇总
2017/11/19 PHP
浅析PHP中的闭包和匿名函数
2017/12/25 PHP
Js制作点击输入框时默认文字消失的效果
2015/09/05 Javascript
基于jquery实现复选框全选,反选,全不选等功能
2015/10/16 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
运用js教你轻松制作html音乐播放器
2020/04/17 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
AngularJS 教程及实例代码
2017/10/23 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
JS实现多功能计算器
2020/10/28 Javascript
在Django中同时使用多个配置文件的方法
2015/07/22 Python
python中json格式数据输出的简单实现方法
2016/10/31 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
Python调用系统命令os.system()和os.popen()的实现
2020/12/31 Python
利用HTML5的新特点实现图片文件异步上传
2014/05/29 HTML / CSS
amazeui树节点自动展开折叠面板并选中第一个树节点的实现
2020/08/24 HTML / CSS
新加坡领先的时尚生活方式零售品牌:CHARLES & KEITH
2018/01/16 全球购物
平民服装店创业计划书
2014/01/17 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
制定企业培训计划的五大要点!
2019/07/10 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
Python图片验证码降噪和8邻域降噪
2021/08/30 Python