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分页函数
Jul 08 PHP
PHP新手上路(十二)
Oct 09 PHP
六酷社区论坛HOME页清新格调免费版 下载
Mar 07 PHP
解析dedecms空间迁移步骤详解
May 15 PHP
举例讲解PHP面对对象编程的多态
Aug 12 PHP
PHP常用技巧汇总
Mar 04 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
php基于环形链表解决约瑟夫环问题示例
Nov 07 PHP
自写的利用PDO对mysql数据库增删改查操作类
Feb 19 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
PHP实现websocket通信的方法示例
Aug 28 PHP
PHP一个简单的无需刷新爬虫
Jan 05 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
实现复选框全选/全不选切换
2006/12/23 Javascript
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
Jquery 插件开发笔记整理
2011/01/17 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
Prototype的Class.create函数解析
2011/09/22 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
Javascript中this关键字的一些小知识
2015/03/15 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
js实现密码强度检验
2017/01/15 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
在使用JSON格式处理数据时应该注意的问题小结
2017/05/20 Javascript
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
用Python进行基础的函数式编程的教程
2015/03/31 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
python实现坦克大战游戏 附详细注释
2020/03/27 Python
python中自带的三个装饰器的实现
2019/11/08 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
2020/11/19 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
css3给背景图片加颜色遮罩的方法
2019/11/05 HTML / CSS
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
《世界多美呀》教学反思
2014/03/02 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
邀请书格式范文
2015/02/02 职场文书
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android