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 getsiteurl()函数
Sep 05 PHP
PHP数组内存耗用太多问题的解决方法
Apr 05 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 PHP
php使用ICQ网关发送手机短信
Oct 30 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
PHP计算加权平均数的方法
Jul 16 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
php基于jquery的ajax技术传递json数据简单实例
Apr 15 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
Oct 10 PHP
浅谈PHP中类和对象的相关函数
Apr 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使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
详解自动生成博客目录案例
2016/12/09 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
2017/08/16 Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
2018/01/30 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
JS解析后台返回的JSON格式数据实例
2018/08/06 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
js实现验证码干扰(动态)
2021/02/23 Javascript
[02:51]2014DOTA2国际邀请赛 IG战队官方纪录片
2014/07/21 DOTA
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python正则分组的应用
2013/11/10 Python
Python与Redis的连接教程
2015/04/22 Python
python简单文本处理的方法
2015/07/10 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
2018/04/26 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
Html5与App的通讯方式详解
2019/10/24 HTML / CSS
Gap中国官网:美式休闲风服饰
2017/02/05 全球购物
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
老公给老婆的道歉信
2014/01/10 职场文书
网吧消防安全制度
2014/01/28 职场文书
高中历史教学反思
2014/02/08 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
公司聘任书模板
2014/03/29 职场文书
实施意见格式范本
2015/06/05 职场文书