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作的文本留言本的例子(二)
Oct 09 PHP
PHP学习之PHP变量
Oct 09 PHP
PHP 获取MSN好友列表的代码(2009-05-14测试通过)
Sep 09 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
Jun 25 PHP
php 判断字符串中是否包含html标签
Feb 17 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
Sep 14 PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 PHP
一个简单安全的PHP验证码类 附调用方法
Jun 24 PHP
php投票系统之增加与删除投票(管理员篇)
Jul 01 PHP
PHP用户验证和标签推荐的简单使用
Oct 31 PHP
php使用fullcalendar日历插件详解
Mar 06 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
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
python中模块查找的原理与方法详解
2017/08/11 Python
python正则实现提取电话功能
2018/02/24 Python
python复制列表时[:]和[::]之间有什么区别
2018/10/16 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
django rest framework 过滤时间操作
2020/07/12 Python
Python类型转换的魔术方法详解
2020/12/23 Python
css3图片边框border-image的用法
2017/06/30 HTML / CSS
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
什么是岗位职责
2013/11/12 职场文书
人力资源经理自我评价
2014/01/04 职场文书
解除合同协议书
2014/04/17 职场文书
小露珠教学反思
2014/04/30 职场文书
学校文明单位申报材料
2014/05/06 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS