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 相关文章推荐
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
怎么样可以把 phpinfo()屏蔽掉?
Nov 24 PHP
从一个不错的留言本弄的mysql数据库操作类
Sep 02 PHP
页面乱码问题的根源及其分析
Aug 09 PHP
php中的字符编码转换函数用法示例
Oct 20 PHP
PHP Static延迟静态绑定用法分析
Mar 16 PHP
Yii2如何批量添加数据
May 17 PHP
ThinkPHP打水印及设置水印位置的方法
Oct 14 PHP
thinkPHP框架实现多表查询的方法
Jun 14 PHP
ThinkPHP3.2框架操作Redis的方法分析
May 05 PHP
基于PHP实现微信小程序客服消息功能
Aug 12 PHP
php 使用html5 XHR2实现上传文件与进度显示功能示例
Mar 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操作mysql数据库类
2014/12/08 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
javascript面向对象编程代码
2011/12/19 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
解决VUE框架 导致绑定事件的阻止冒泡失效问题
2018/02/24 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
javascript操作向表格中动态加载数据
2020/08/27 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
python threading模块操作多线程介绍
2015/04/08 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python 自动批量打开网页的示例
2019/02/21 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
2020/03/06 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
国外最大的眼镜网站:Coastal
2017/08/09 全球购物
Java TransactionAPI (JTA) 主要包含几部分
2012/12/07 面试题
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
计算机专业毕业生推荐信
2013/11/25 职场文书
开学典礼感言
2014/02/16 职场文书
就业协议书范本
2014/10/08 职场文书
项目合作意向书
2015/05/08 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
Mysql效率优化定位较低sql的两种方式
2021/05/26 MySQL
浅谈Web Storage API的使用
2021/06/23 Javascript
python+pytest接口自动化之token关联登录的实现
2022/04/06 Python
Java Spring读取和存储详细操作
2022/08/05 Java/Android