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正则
Jul 07 PHP
php获取后台Job管理的实现代码
Jun 10 PHP
hadoop中一些常用的命令介绍
Jun 19 PHP
PHP中实现生成静态文件的方法缓解服务器压力
Jan 07 PHP
php+mysql实现用户注册登陆的方法
Jan 03 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
php图像处理类实例
Jul 28 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
php实现面包屑导航例子分享
Dec 19 PHP
WordPress过滤垃圾评论的几种主要方法小结
Jul 11 PHP
PHP 常用时间函数资料整理
Oct 22 PHP
php实现获取近几日、月时间示例
Jul 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
javascript call方法使用说明
2010/01/11 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
ECMAScript6块级作用域及新变量声明(let)
2015/06/12 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
javascript宿主对象之window.navigator详解
2016/09/07 Javascript
js实时获取窗口大小变化的实例代码
2016/11/18 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
Python中字符编码简介、方法及使用建议
2015/01/08 Python
Python遍历目录并批量更换文件名和目录名的方法
2016/09/19 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
基于pandas向csv添加新的行和列
2020/05/25 Python
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
html5自定义video标签的海报与播放按钮功能
2019/12/04 HTML / CSS
MIS软件工程师的面试题
2016/04/22 面试题
商务日语专业毕业生求职信
2013/10/26 职场文书
皮肤科医师岗位职责
2013/12/04 职场文书
优秀教师的感人事迹
2014/02/04 职场文书
党员领导干部承诺书
2014/05/28 职场文书
辞旧迎新演讲稿
2014/09/15 职场文书
发票退票证明
2015/06/24 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书
python 制作一个gui界面的翻译工具
2021/05/14 Python
python利用pandas分析学生期末成绩实例代码
2021/07/09 Python