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 array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
php程序总是提示验证码输入有误解决方案
Jan 07 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
apache和PHP如何整合在一起
Oct 12 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
PHP删除数组中指定下标的元素方法
Feb 03 PHP
YII框架常用技巧总结
Apr 27 PHP
PHP面向对象类型约束用法分析
Jun 12 PHP
PHP+redis实现微博的拉模型案例详解
Jul 10 PHP
PHP中Session ID的实现原理实例分析
Aug 17 PHP
laravel框架中间件简单使用方法示例
Jan 25 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 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 一个随机字符串生成代码
2010/05/26 PHP
PHP include_path设置技巧分享
2011/07/03 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
一文快速详解前端框架 Vue 最强大的功能
2019/05/21 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python基本语法经典教程
2016/03/11 Python
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
海南地接欢迎词
2014/01/14 职场文书
党委班子剖析材料
2014/08/21 职场文书
同乡会致辞
2015/07/30 职场文书
python 实现体质指数BMI计算
2021/05/26 Python
PYTHON InceptionV3模型的复现详解
2022/05/06 Python
一文解答什么是MySQL的回表
2022/08/05 MySQL