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 相关文章推荐
自动把纯文本转换成Web页面的php代码
Aug 27 PHP
javascript 小型动画组件与实现代码
Jun 02 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
php自定义session示例分享
Apr 22 PHP
单台服务器的PHP进程之间实现共享内存的方法
Jun 13 PHP
php实现通过cookie换肤的方法
Jul 13 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
iOS10推送通知开发教程
Sep 19 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
Oct 10 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
php array_merge下进行数组合并的代码
2008/07/22 PHP
PHP URL路由类实例
2013/11/12 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
基于JQuery的日期联动实现代码
2011/02/24 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
python数据结构之二叉树的遍历实例
2014/04/29 Python
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
python__name__原理及用法详解
2019/11/02 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
使用python创建生成动态链接库dll的方法
2020/05/09 Python
使用Python快速打开一个百万行级别的超大Excel文件的方法
2021/03/02 Python
会计大学生职业生涯规划书范文
2014/01/13 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
毕业评语大全
2014/05/04 职场文书
2014年征兵标语
2014/06/20 职场文书
总经理助理岗位职责
2015/01/31 职场文书
单位收入证明范本
2015/06/18 职场文书
医德医风学习心得体会
2016/01/25 职场文书
导游词之西安骊山
2019/12/20 职场文书
微信小程序基础教程之echart的使用
2021/06/01 Javascript