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面向对象全攻略 (七) 继承性
Sep 30 PHP
PHPMailer邮件发送的实现代码
May 04 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
检查用户名是否已在mysql中存在的php写法
Jan 20 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
分享下php5类中三种数据类型的区别
Jan 26 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
Yii统计不同类型邮箱数量的方法
Oct 18 PHP
php提交表单时保留多个空格及换行的文本样式的方法
Jun 20 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
Sep 01 PHP
PHP单例模式数据库连接类与页面静态化实现方法
Mar 20 PHP
laravel5表单唯一验证的实例代码
Sep 30 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实现的MySQL通用查询程序
2007/03/11 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
ThinkPHP模型详解
2015/07/27 PHP
PHP序列化和反序列化深度剖析实例讲解
2020/12/29 PHP
PHP7 windows支持
2021/03/09 PHP
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
怎么选择Javascript框架(Javascript Framework)
2013/11/22 Javascript
JavaScript中获取Radio被选中的值
2015/11/11 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
2017/04/07 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
微信小程序中使用ECharts 异步加载数据实现图表功能
2018/07/13 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
在element-ui的el-tree组件中用render函数生成el-button的实例代码
2018/11/05 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python实现高效求解素数代码实例
2015/06/30 Python
dataframe设置两个条件取值的实例
2018/04/12 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
python pygame实现挡板弹球游戏
2019/11/25 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
编辑找工作求职信分享
2014/01/03 职场文书
网吧七夕活动策划方案
2014/08/31 职场文书
2015暑假假期总结
2015/07/13 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
《废话连篇——致新手》——chinapizza
2022/04/05 无线电