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 win下Socket方式发邮件类
Aug 21 PHP
PHP教程 预定义变量
Oct 23 PHP
PHP随机数生成代码与使用实例分析
Apr 08 PHP
在smarty模板中使用PHP函数的方法
Apr 23 PHP
PHP数组操作汇总 php数组的使用技巧
Jul 17 PHP
PHP 使用MySQL管理Session的回调函数详解
Jun 21 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
Mar 10 PHP
php中smarty区域循环的方法
Jun 11 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
Dec 15 PHP
PHP jQuery+Ajax结合写批量删除功能
May 19 PHP
PHP lcfirst()函数定义与用法
Mar 08 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
Oct 13 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 验证码制作(网树注释思想)
2009/07/20 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
PHP中MVC模式的模板引擎开发经验分享
2011/03/23 PHP
Windows 下安装 swoole 图文教程(php)
2017/06/05 PHP
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
[08:53]DOTA2每周TOP10 精彩击杀集锦vol.9
2014/06/26 DOTA
Python异常学习笔记
2015/02/03 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
2016/09/18 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
通过python爬虫赚钱的方法
2019/01/29 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
scrapy中如何设置应用cookies的方法(3种)
2020/09/22 Python
python如何写个俄罗斯方块
2020/11/06 Python
HTML5+CSS3 实现灵动的动画 TAB 切换效果(DEMO)
2017/09/15 HTML / CSS
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
巡警年度自我鉴定
2014/02/21 职场文书
李强感恩观后感
2015/06/17 职场文书
党员转正大会主持词
2015/07/02 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python