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目录导航文件代码
Oct 09 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 PHP
PHP类与对象中的private访问控制的疑问
Nov 01 PHP
比较简单的百度网盘文件直链PHP代码
Mar 24 PHP
使用php清除bom示例
Mar 03 PHP
php使用session二维数组实例
Nov 06 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
Nov 09 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
PHP自定义函数实现数组比较功能示例
Oct 19 PHP
laravel5使用freetds连接sql server的方法
Dec 07 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 PHP
laravel实现上传图片并在页面显示的例子
Oct 14 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缓冲输出实例分析
2015/01/05 PHP
curl 出现错误的调试方法(必看)
2017/02/13 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
php写app用的框架整理
2019/09/29 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
jQuery的$.proxy()应用示例介绍
2014/04/03 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
javascript给span标签赋值的方法
2015/11/26 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
js使用formData实现批量上传
2020/03/27 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
js实现秒表计时器
2019/12/16 Javascript
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
Python验证企业工商注册码
2015/10/25 Python
Python书单 不将就
2017/07/11 Python
python向已存在的excel中新增表,不覆盖原数据的实例
2018/05/02 Python
python opencv摄像头的简单应用
2019/06/06 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
python将字符串转换成json的方法小结
2019/07/09 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
css3学习心得分享
2013/08/19 HTML / CSS
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
HTML5头部标签的一些常用信息小结
2016/10/23 HTML / CSS
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
Viking比利时:购买办公用品
2019/10/30 全球购物
StringBuilder和String的区别
2015/05/18 面试题
文科教师毕业的自我评价
2014/01/16 职场文书
建筑工地大门标语
2014/06/18 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
2021/05/25 Python
Python TypeError: ‘float‘ object is not subscriptable错误解决
2022/12/24 Python