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&amp;&amp;mysql)一
Oct 09 PHP
php如何调用webservice应用介绍
Nov 24 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
Jun 24 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
CodeIgniter配置之config.php用法实例分析
Jan 19 PHP
PHPStorm+XDebug进行调试图文教程
Jun 13 PHP
微信支付开发维权通知实例
Jul 12 PHP
PHP 文件锁与进程锁的使用示例
Aug 07 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 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实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
PHP中基本HTTP认证技巧分析
2015/03/16 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
JS仿京东移动端手指拨动切换轮播图效果
2020/04/10 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
Python random模块用法解析及简单示例
2017/12/18 Python
详解Python之unittest单元测试代码
2018/01/24 Python
详解Python网络框架Django和Scrapy安装指南
2019/04/01 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
Python中注释(多行注释和单行注释)的用法实例
2019/08/28 Python
Python IDE环境之 新版Pycharm安装详细教程
2020/03/05 Python
完美解决pyinstaller打包报错找不到依赖pypiwin32或pywin32-ctypes的错误
2020/04/01 Python
python文件读取失败怎么处理
2020/06/23 Python
python爬虫用mongodb的理由
2020/07/28 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
大学毕业感言50字
2014/02/07 职场文书
物流毕业生个人的自我评价
2014/02/13 职场文书
《最可爱的人》教学反思
2014/02/14 职场文书
通信工程专业求职信
2014/06/04 职场文书