PHP的autoload自动加载机制使用说明


Posted in PHP onDecember 28, 2010

在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来,但是这样可能会使得在引用文件的新脚本中,存在大量的include或require方法调用,如果一时疏忽遗漏则会产生错误,使得代码难以维护。

自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,通常我们会这么写:

function __autoload($className) { 
include_once $className . '.class.php'; 
} $user = new User();

当PHP引擎试图实例化一个未知类的操作时,会调用__autoload()方法,在PHP出错失败前有了最后一个机会加载所需的类。因此,上面的这段代码执行时,PHP引擎实际上替我们自动执行了一次__autoload方法,将User.class.php这个文件包含进来。

在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误。

如果使用 PHP的CLI交互模式时,自动加载机制将不会执行。

当你希望使用PEAR风格的命名规则,例如需要引入User/Register.php文件,也可以这么实现:

//加载我 
function __autoload($className) { 
$file = str_replace('_', DIRECTORY_SEPARATOR, $className); 
include_once $file . 'php'; 
} 
$userRegister = new User_Register();

这种方法虽然方便,但是在一个大型应用中如果引入多个类库的时候,可能会因为不同类库的autoload机制而产生一些莫名其妙的问题。在PHP5引入SPL标准库后,我们又多了一种新的解决方案,spl_autoload_register()函数。

此函数的功能就是把函数注册至SPL的__autoload函数栈中,并移除系统默认的__autoload()函数。一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用__autoload()函数,下例调用的是User/Register.php而不是User_Register.class.php:

//不加载我 
function __autoload($className) { 
include_once $className . '.class.php'; 
} 
//加载我 
function autoload($className) { 
$file = str_replace('/', DIRECTORY_SEPARATOR, $className); 
include_once $file . '.php'; 
} 
//开始加载 
spl_autoload_register('autoload'); 
$userRegister = new User_Register();

在使用spl_autoload_register()的时候,我们还可以考虑采用一种更安全的初始化调用方法,参考如下:

//系统默认__autoload函数 
function __autoload($className) { 
include_once $className . '.class.php'; 
} 
//可供SPL加载的__autoload函数 
function autoload($className) { 
$file = str_replace('_', DIRECTORY_SEPARATOR, $className); 
include_once $file . '.php'; 
} 
//不小心加载错了函数名,同时又把默认__autoload机制给取消了……? 
spl_autoload_register('_autoload', false); 
//容错机制 
if(false === spl_autoload_functions()) { 
if(function_exists('__autoload')) { 
spl_autoload_register('__autoload', false); 
} 
}

奇技淫巧:在Unix/Linux环境下,如果你有多个规模较小的类,为了管理方便,都写在一个php文件中的时候,可以通过以ln -s命令做软链接的方式快速分发成多个不同类名的拷贝,再通过autoload机制进行加载。
PHP 相关文章推荐
用php和MySql来与ODBC数据连接
Oct 09 PHP
用Zend Encode编写开发PHP程序
Feb 21 PHP
mysql下创建字段并设置主键的php代码
May 16 PHP
Joomla下利用configuration.php存储简单数据
May 19 PHP
PHP的SQL注入过程分析
Jan 06 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
Jun 28 PHP
phpExcel中文帮助手册之常用功能指南
Aug 18 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
PHP对象克隆clone用法示例
Sep 28 PHP
php面向对象的用户登录身份验证
Jun 08 PHP
Laravel框架中集成MongoDB和使用详解
Oct 17 PHP
php的ajax框架xajax入门与试用介绍
Dec 19 #PHP
几款免费开源的不用数据库的php的cms
Dec 19 #PHP
PHP操作XML作为数据库的类
Dec 19 #PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
Dec 19 #PHP
PHP与MySQL开发的8个技巧小结
Dec 17 #PHP
hessian 在PHP中的使用介绍
Dec 13 #PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
Dec 12 #PHP
You might like
用PHP实现验证码功能
2006/10/09 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
js下弹出窗口的变通
2007/04/18 Javascript
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
javascript中的prototype属性实例分析说明
2010/08/09 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
JavaScript中的值是按值传递还是按引用传递问题探讨
2015/01/30 Javascript
jQuery中 prop() attr()使用详解
2015/05/19 Javascript
js中的内部属性与delete操作符介绍
2015/08/10 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
2016/04/19 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
JavaScript引用类型Array实例分析
2018/07/24 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
一份全面的PHP面试问题考卷
2012/07/15 面试题
运动会稿件50字
2014/02/17 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
社区端午节活动总结
2015/02/11 职场文书
茶花女读书笔记
2015/06/29 职场文书
关于车尾的标语大全
2015/08/11 职场文书
创业计划书之宠物店
2019/09/19 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python