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
基于qmail的完整WEBMAIL解决方案安装详解
Oct 09 PHP
用PHP将网址字符串转换成超链接(网址或email)
May 25 PHP
小文件php+SQLite存储方案
Sep 04 PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 PHP
将php数组输出html表格的方法
Feb 24 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
PHP yii实现model添加默认值的方法(两种方法)
Nov 10 PHP
CI框架实现创建自定义类库的方法
Dec 25 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
php传值和传引用的区别点总结
Nov 19 PHP
PHP dirname简单使用代码实例
Nov 13 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下关于中英数字混排的字符串分割问题
2010/04/06 PHP
探讨:web上存漏洞及原理分析、防范方法
2013/06/29 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
实例介绍PHP的Reflection反射机制
2014/08/05 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
2016/03/19 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
JQuery遍历DOM节点的方法
2015/06/11 Javascript
详解Angular之constructor和ngOnInit差异及适用场景
2017/06/22 Javascript
深入浅析javascript继承体系
2017/10/23 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
原生js添加一个或多个类名的方法分析
2019/07/30 Javascript
JS实现简易计算器
2020/02/14 Javascript
python编写的最短路径算法
2015/03/25 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
Python编程实现蚁群算法详解
2017/11/13 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
详解Python3中ceil()函数用法
2019/02/19 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Python笔记之facade模式
2019/11/20 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
一个SQL面试题
2014/08/21 面试题
汽车机修工岗位职责
2014/03/06 职场文书
2014年党员自我评议总结
2014/09/23 职场文书
投标邀请书范本
2015/02/02 职场文书
2015年党风廉政建设目标责任书
2015/05/08 职场文书
公司费用报销管理制度
2015/08/04 职场文书
《富饶的西沙群岛》教学反思
2016/02/16 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书