PHP中spl_autoload_register函数的用法总结


Posted in PHP onNovember 07, 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.';  
}  
}

<?php
class A
{
public function __construct()
{
echo 'Got it.';
}
}
然后我们有一个index.php需要用到这个类A,常规的写法就是
<?php  
require('A.php');  
$a = new 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();

<?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
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 相关文章推荐
自己前几天写的无限分类类
Feb 14 PHP
php include的妙用,实现路径加密
Jul 29 PHP
PHP 引用文件技巧
Mar 02 PHP
PHP下判断网址是否有效的代码
Oct 08 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
php计算2个日期的差值函数分享
Feb 02 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
php加密之discuz内容经典加密方式实例详解
Feb 04 PHP
windows下的WAMP环境搭建图文教程(推荐)
Jul 27 PHP
Laravel框架路由设置与使用示例
Jun 12 PHP
Yii框架数据库查询、增加、删除操作示例
Oct 14 PHP
php去除HTML标签实例
Nov 06 #PHP
php实现监听事件
Nov 06 #PHP
php生成扇形比例图实例
Nov 06 #PHP
php多用户读写文件冲突的解决办法
Nov 06 #PHP
php生成图形(Libchart)实例
Nov 06 #PHP
php ZipArchive压缩函数详解实例
Nov 06 #PHP
php根据分类合并数组的方法实例详解
Nov 06 #PHP
You might like
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
PHP遍历目录并返回统计目录大小
2014/06/09 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
法国一家芭蕾舞鞋公司:Repetto
2018/11/12 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
高三毕业生自我鉴定
2013/12/20 职场文书
先进个人事迹材料
2014/01/25 职场文书
应用心理学专业求职信
2014/08/04 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
走群众路线学习心得体会
2014/10/31 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python