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代码
Dec 06 PHP
PHP 网页过期时间的控制代码
Jun 29 PHP
解析:使用php mongodb扩展时 需要注意的事项
Jun 18 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 PHP
使用PHP生成二维码的两种方法(带logo图像)
Mar 14 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
php简单图像创建入门实例
Jun 10 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
Oct 27 PHP
php编程每天必学之表单验证
Mar 01 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
php微信开发接入
Aug 27 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
Feb 03 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 __autoload()方法真的影响性能吗?
2012/03/30 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
超炫的jquery仿flash导航栏特效
2014/11/11 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
Swiper实现轮播图效果
2017/07/03 Javascript
Vue2 SSR渲染根据不同页面修改 meta
2017/11/20 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
python通过pil为png图片填充上背景颜色的方法
2015/03/17 Python
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/26 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
Python3实现配置文件差异对比脚本
2019/11/18 Python
Python2与Python3的区别点整理
2019/12/12 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
python下载的库包存放路径
2020/07/27 Python
Python 无限级分类树状结构生成算法的实现
2021/01/21 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
英文版餐饮运营管理求职信
2013/11/06 职场文书
策划总监岗位职责
2014/02/16 职场文书
需求分析说明书
2014/05/09 职场文书
优秀员工评优方案
2014/06/13 职场文书
计生工作先进事迹
2014/08/15 职场文书
会计人员演讲稿
2014/09/11 职场文书
三严三实对照检查材料
2014/09/22 职场文书
小学校园广播稿集锦
2014/10/04 职场文书