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下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
Jun 09 PHP
PHP读取数据库并按照中文名称进行排序实现代码
Jan 29 PHP
php提交表单发送邮件的方法
Mar 20 PHP
php中ob函数缓冲机制深入理解
Aug 03 PHP
php搜索文件程序分享
Oct 30 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
各种快递查询--Api接口
Apr 26 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
May 17 PHP
php 实现Hash表功能实例详解
Nov 29 PHP
php 猴子摘桃的算法
Jun 20 PHP
php实现表单提交上传文件功能
May 28 PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 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慢查询日志和错误日志使用详解
2021/02/27 PHP
jQuery 使用个人心得
2009/02/26 Javascript
JavaScript 事件查询综合
2009/07/13 Javascript
js 模拟气泡屏保效果代码
2010/07/10 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
SuperSlide标签切换、焦点图多种组合插件
2015/03/14 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
提高jQuery性能优化的技巧
2015/08/03 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
2017/01/12 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
简单的Vue SSR的示例代码
2018/01/12 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
使用Vue实现一个树组件的示例
2020/11/06 Javascript
简单学习Python time模块
2016/04/29 Python
Python实现单词翻译功能
2017/06/06 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
用python画一只可爱的皮卡丘实例
2019/11/21 Python
Python调用飞书发送消息的示例
2020/11/10 Python
购买澳大利亚最好的服装和内衣在线:BONDS
2016/10/14 全球购物
沪江旗下的海量优质课程平台:沪江网校
2017/11/07 全球购物
估算杭州有多少软件工程师
2015/08/11 面试题
千与千寻观后感
2015/06/04 职场文书
工程进度款催款函
2015/06/24 职场文书
劳动模范获奖感言
2015/07/31 职场文书
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
JavaScript实现九宫格拖拽效果
2022/06/28 Javascript