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 相关文章推荐
一个显示天气预报的程序
Oct 09 PHP
用缓存实现静态页面的测试
Dec 06 PHP
PHP 中执行排序与 MySQL 中排序
Apr 21 PHP
PHP 源代码压缩小工具
Dec 22 PHP
PHP开发规范手册之PHP代码规范详解
Jan 13 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
Aug 04 PHP
推荐5款跨平台的PHP编辑器
Dec 25 PHP
php计算多维数组中所有值总和的方法
Jun 24 PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
Sep 18 PHP
asp.net和php的区别点总结
Oct 10 PHP
PHP基于array_unique实现二维数组去重
Jul 14 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
对淘宝URL中ID提取的PHP代码
2013/09/01 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
2017/02/08 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
jQuery实现验证用户登录
2019/12/10 jQuery
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
vue-以文件流-blob-的形式-下载-导出文件操作
2020/08/07 Javascript
Python函数的周期性执行实现方法
2016/08/13 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
CSS3区域模块region相关编写示例
2015/08/28 HTML / CSS
歌唱比赛主持词
2014/03/18 职场文书
初三新学期计划书
2014/05/03 职场文书
财务部绩效考核方案
2014/05/04 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
辞职信怎么写
2015/02/27 职场文书
新闻稿标题
2015/07/18 职场文书
新党员入党决心书
2015/09/22 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技
sql server 累计求和实现代码
2022/02/28 SQL Server