spl_autoload_register与autoload的区别详解


Posted in PHP onJune 03, 2013

spl_autoload_register
(PHP 5 >= 5.1.2)
spl_autoload_register — 注册__autoload()函数
说明
bool spl_autoload_register ([ callback $autoload_function ] )
将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为
spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或
spl_autoload_call()。
参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数
spl_autoload()。
返回值
如果成功则返回 TRUE,失败则返回 FALSE。
注:SPL是Standard PHP  Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。SPL  autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数spl_autoload,  spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。
范例
设我们有一个类文件A.php,里面定义了一个名字为A的类:

<?php
class A
{
public function __construct()
{
echo 'Got it.';
}
}

然后我们有一个index.php需要用到这个类A,常规的写法就是
<?php
require('A.php');
$a = new A();

但是有一个问题就是,假如我们的index.php需要包含的不只是类A,而是需要很多类,这样子就必须写很多行require语句,有时候也会让人觉得不爽。
不过在php5之后的版本,我们就不再需要这样做了。在php5中,试图使用尚未定义的类时会自动调用autoload函数,所以我们可以通过编写__autoload函数来让php自动加载类,而不必写一个长长的包含文件列表。
例如在上面那个例子中,index.php可以这样写:
<?php
function __autoload($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
$a = new A();

当然上面只是最简单的示范,__autoload只是去include_path寻找类文件并加载,我们可以根据自己的需要定义__autoload加载类的规则。
此外,假如我们不想自动加载的时候调用__autoload,而是调用我们自己的函数(或者类方法),我们可以使用spl_autoload_register来注册我们自己的autoload函数。它的函数原型如下:
bool spl_autoload_register ( [callback $autoload_function] )
我们继续改写上面那个例子:
<?php
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');
$a = new A();

这样子也是可以正常运行的,这时候php在寻找类的时候就没有调用__autoload而是调用我们自己定义的函数loader了。同样的道理,下面这种写法也是可以的:
<?php   
class Loader   
{   
public static function loadClass($class)   
{   
$file = $class . '.php';   
if (is_file($file)) {   
require_once($file);   
}   
}   
}   
spl_autoload_register(array('Loader', 'loadClass'));   
$a = new A();

PHP 相关文章推荐
php 无限分类的树类代码
Dec 03 PHP
php简单提示框alert封装函数
Aug 08 PHP
PHP分页函数代码(简单实用型)
Dec 02 PHP
php中require和require_once的区别说明
Feb 27 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
PHP自毁程序(慎用)
Jul 09 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
php自定义函数实现JS的escape的方法示例
Jul 07 PHP
PHP使用SMTP邮件服务器发送邮件示例
Aug 28 PHP
PHP html_entity_decode()函数讲解
Feb 25 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 PHP
如何用PHP websocket实现网页实时聊天
May 26 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 #PHP
linux命令之调试工具strace的深入分析
Jun 03 #PHP
如何使用Strace调试工具
Jun 03 #PHP
鸡肋的PHP单例模式应用详解
Jun 03 #PHP
phpize的深入理解
Jun 03 #PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 #PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 #PHP
You might like
PHP 和 XML: 使用expat函数(一)
2006/10/09 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
js实现input框文字动态变换显示效果
2015/08/19 Javascript
bootstrap datetimepicker2.3.11时间插件使用
2016/11/19 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
Django模板继承 extend标签实例代码详解
2019/05/16 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
超轻量级的js时间库miment使用解析
2019/08/02 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[45:17]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第三场 1月9日
2021/03/11 DOTA
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
python 获取字符串MD5值方法
2018/05/29 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
Java面试题汇总
2015/12/06 面试题
毕业留言寄语大全
2014/04/10 职场文书
党员服务承诺书
2014/05/28 职场文书
国贸专业求职信
2014/06/28 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
测量员岗位职责
2015/02/14 职场文书
母亲去世追悼词
2015/06/23 职场文书
个人售房合同协议书
2016/03/21 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书