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 相关文章推荐
PHP4 与 MySQL 交互使用
Oct 09 PHP
随时给自己贴的图片加文字的php水印
Mar 16 PHP
几个php应用技巧
Mar 27 PHP
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
Dec 10 PHP
php购物车实现方法
Jan 03 PHP
smarty内置函数capture用法分析
Jan 22 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
Jan 18 PHP
PHP使用file_get_content设置头信息的方法
Feb 14 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
PHP后台实现微信小程序登录
Aug 03 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
May 14 PHP
phpmyadmin在宝塔面板里进不去的解决方案
Jul 06 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
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php获取错误信息的方法
2015/07/17 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
培养自己的php编码规范
2015/09/28 PHP
MAC下通过改apache配置文件切换php多版本的方法
2017/04/26 PHP
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
Centos7 中安装 Node.js v4.4.4
2016/11/03 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
2018/09/13 Python
Python 共享变量加锁、释放详解
2019/08/28 Python
python 五子棋如何获得鼠标点击坐标
2019/11/04 Python
在Python中通过threshold创建mask方式
2020/02/19 Python
分享8款纯CSS3实现的搜索框功能
2017/09/14 HTML / CSS
HTML5的结构和语义(5):交互
2008/10/17 HTML / CSS
尼克松手表官网:Nixon手表
2019/03/17 全球购物
西门豹教学反思
2014/02/04 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
护士实习求职信
2014/06/22 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
百万英镑观后感
2015/06/09 职场文书
公司新员工欢迎词
2015/09/30 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL
利用Java连接Hadoop进行编程
2022/06/28 Java/Android