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安装问题
Oct 09 PHP
建立动态的WML站点(二)
Oct 09 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
php设计模式 Visitor 访问者模式
Jun 28 PHP
9个经典的PHP代码片段分享
Dec 18 PHP
CodeIgniter配置之database.php用法实例分析
Jan 20 PHP
PHP设计模式之工厂模式与单例模式
Sep 28 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
PHP单态模式简单用法示例
Nov 16 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
php字符串截取函数mb_substr用法实例分析
Jun 25 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 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运行环境配置的详解
2013/06/04 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
Codeigniter框架的更新事务(transaction)BUG及解决方法
2014/07/25 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
jquery实现的随机多彩tag标签随机颜色和字号大小效果
2014/03/27 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
jQuery实现倒计时功能 jQuery实现计时器功能
2017/09/19 jQuery
angularjs实现猜大小功能
2017/10/23 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
javascript实现最长公共子序列实例代码
2018/02/05 Javascript
微信小程序页面上下滚动效果
2020/11/18 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
js+canvas实现纸牌游戏
2020/03/16 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Python实现的连接mssql数据库操作示例
2018/08/17 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
大学生最常用的自我评价
2013/12/07 职场文书
消防宣传口号
2014/06/16 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
优秀团员事迹材料
2014/12/25 职场文书