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 相关文章推荐
怎样在UNIX系统下安装MySQL
Oct 09 PHP
PHP 翻页 实例代码
Aug 07 PHP
php垃圾代码优化操作代码
Aug 05 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
PHP查询网站的PR值
Oct 30 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
Nov 12 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
php上传图片获取路径及给表单字段赋值的方法
Jan 23 PHP
如何正确配置Nginx + PHP
Jul 15 PHP
Nginx+php配置文件及原理解析
Dec 09 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
PHP array_push 数组函数
2009/12/26 PHP
Web程序工作原理详解
2014/12/25 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
PHP安全下载文件的方法
2016/04/07 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
Prototype Array对象 学习
2009/07/19 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
单元选择合并变色示例代码
2014/05/26 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
bootstrap改变按钮加载状态
2014/12/01 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
jquery常用的12个小功能
2016/07/22 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
js实现删除json中指定的元素
2020/09/22 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
Python 爬虫的工具列表大全
2016/01/31 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Python 实现一个计时器
2020/07/28 Python
HTML5中的新元素介绍
2008/10/17 HTML / CSS
Python里面search()和match()的区别
2016/09/21 面试题
融资租赁计划书
2014/04/29 职场文书
医药销售自我评价200字
2014/09/11 职场文书
2014年企业工会工作总结
2014/11/12 职场文书
2015年毕业实习工作总结
2014/12/12 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
干部理论学习心得体会
2016/01/21 职场文书
CSS 使用 resize 实现图片拖拽切换预览功能(强大功能)
2021/08/23 HTML / CSS