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 透明水印生成代码
Aug 27 PHP
深入理解PHP中的Session和Cookie
Jun 21 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
Jun 24 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
Yii使用ajax验证显示错误messagebox的解决方法
Dec 03 PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
Zend Framework动作控制器用法示例
Dec 09 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 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
解决phpmyadmin中文乱码问题。。。
2007/01/18 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
php 获取当前访问的url文件名的方法小结
2010/02/08 PHP
在项目中寻找代码的坏命名
2012/07/14 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
excel操作之Add Data to a Spreadsheet Cell
2007/06/12 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
简单谈谈json跨域
2016/03/13 Javascript
Node.js 8 中的重要新特性
2017/06/28 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
react PropTypes校验传递的值操作示例
2020/04/28 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
Python实现生成密码字典的方法示例
2019/09/02 Python
python 利用turtle库绘制笑脸和哭脸的例子
2019/11/23 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
2020/02/11 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
main 函数执行以前,还会执行什么代码
2013/04/17 面试题
汽修专业学生自我鉴定
2013/11/16 职场文书
彩妆大赛策划方案
2014/05/13 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
亚运会口号
2014/06/20 职场文书
银行转正自我鉴定
2014/09/29 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
Python图像处理之图像拼接
2021/04/28 Python
关于Python使用turtle库画任意图的问题
2022/04/01 Python
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis