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 相关文章推荐
PHP的FTP学习(二)
Oct 09 PHP
实例(Smarty+FCKeditor新闻系统)
Jan 02 PHP
探讨:使用XMLSerialize 序列化与反序列化
Jun 08 PHP
PHP系统命令函数使用分析
Jul 05 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
php文件扩展名判断及获取文件扩展名的N种方法
Sep 12 PHP
php 生成Tab键或逗号分隔的CSV
Sep 24 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
TP5框架安全机制实例分析
Apr 05 PHP
详解PHP用mb_string处理windows中文字符
May 26 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
NO3第三帝国留言簿制作过程
2006/10/09 PHP
PHP云打印类完整示例
2016/10/15 PHP
php技巧小结【推荐】
2017/01/19 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
javascript关于“时间”的一次探索
2019/07/24 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
scikit-learn线性回归,多元回归,多项式回归的实现
2019/08/29 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
Python+PyQt5实现灭霸响指功能
2020/05/25 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
const和static readonly区别
2013/05/20 面试题
技术总监管理岗位职责
2014/03/09 职场文书
2014年大学宣传部工作总结
2014/12/19 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
CSS中妙用 drop-shadow 实现线条光影效果
2021/11/11 HTML / CSS