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 相关文章推荐
深入了解php4(2)--重访过去
Oct 09 PHP
亲密接触PHP之PHP语法学习笔记1
Dec 17 PHP
用php获取远程图片并把它保存到本地的代码
Apr 07 PHP
php 中文处理函数集合
Aug 27 PHP
使用配置类定义Codeigniter全局变量
Jun 12 PHP
PHP中echo,print_r与var_dump区别分析
Sep 29 PHP
Laravel框架实现redis集群的方法分析
Sep 14 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
Nov 20 PHP
php实现在线考试系统【附源码】
Sep 18 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 PHP
laravel接管Dingo-api和默认的错误处理方式
Oct 25 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
May 27 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面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
php时间函数用法分析
2016/05/28 PHP
php微信开发之上传临时素材
2016/06/24 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
JavaScript Konami Code 实现代码
2009/07/29 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
2016/10/24 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
用nodejs搭建websocket服务器
2017/01/23 NodeJs
Bootstrap datepicker日期选择器插件使用详解
2017/07/26 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
vue slot与传参实例代码讲解
2019/04/28 Javascript
vue element table中自定义一些input的验证操作
2020/07/18 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
Python表示矩阵的方法分析
2017/05/26 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
Django的Modelforms用法简介
2019/07/27 Python
大韩航空官方网站:Korean Air
2017/10/25 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
学习2014年全国两会心得体会
2014/03/12 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
校本教研活动总结
2014/07/01 职场文书
社区创先争优承诺书
2014/08/30 职场文书
Python预测分词的实现
2021/06/18 Python
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
5个实用的JavaScript新特性
2022/06/16 Javascript