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查询域名状态whois的类
Nov 25 PHP
一篇入门的php Class 文章
Apr 04 PHP
php中的MVC模式运用技巧
May 03 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
PHP中$_SERVER的详细参数与说明介绍
Oct 26 PHP
php的sprintf函数的用法 控制浮点数格式
Feb 14 PHP
PHP加Nginx实现动态裁剪图片方案
Mar 10 PHP
zf框架db类的分页示例分享
Mar 14 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
PHP基于单例模式编写PDO类的方法
Sep 13 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 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移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
AngularJS实现进度条功能示例
2017/07/05 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
javascript中UMD规范的代码推演
2018/08/29 Javascript
2019 年编写现代 JavaScript 代码的5个小技巧(小结)
2019/01/15 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
Vue Echarts实现可视化世界地图代码实例
2019/05/07 Javascript
关于引入vue.js 文件的知识点总结
2020/01/28 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
Python深入06——python的内存管理详解
2016/12/07 Python
解决Python 命令行执行脚本时,提示导入的包找不到的问题
2019/01/19 Python
python简单鼠标自动点击某区域的实例
2019/06/25 Python
Python 中的 global 标识对变量作用域的影响
2019/08/12 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
如何写出高性能的JSP和Servlet
2013/01/22 面试题
行政经理岗位职责
2013/11/09 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
从事会计工作年限证明
2015/06/23 职场文书
外出学习心得体会范文
2016/01/18 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers