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 相关文章推荐
phpMyAdmin 安装教程全攻略
Mar 19 PHP
pw的一个放后门的方法分析
Oct 08 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
php echo, print, print_r, sprintf, var_dump, var_expor的使用区别
Jun 20 PHP
php中运用http调用的GET和POST方法示例
Sep 29 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
PHP中Session可能会引起并发问题
Jun 26 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
PHP获取HTTP body内容的方法
Dec 31 PHP
PHP CURL实现模拟登陆并上传文件操作示例
Jan 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的ajax框架xajax入门与试用介绍
2010/12/19 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
Javascript 遍历对象中的子对象
2009/07/03 Javascript
Javascript继承(上)——对象构建介绍
2012/11/08 Javascript
javascript中的parseInt和parseFloat区别
2013/07/12 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
2017/06/29 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
vue中的router-view组件的使用教程
2018/10/23 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
python数据结构之二叉树的建立实例
2014/04/29 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
Python 代码调试技巧示例代码
2020/08/11 Python
python使用bs4爬取boss直聘静态页面
2020/10/10 Python
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
监理资料员岗位职责
2014/01/03 职场文书
团日活动总结范文
2014/04/25 职场文书
小班幼儿评语大全
2014/04/30 职场文书
先进班集体申报材料
2014/12/26 职场文书
销售开票员岗位职责
2015/04/15 职场文书
2015年幼师工作总结
2015/04/28 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
交通安全教育心得体会
2016/01/15 职场文书
2019年大学生暑期社会实践调查报告模板
2019/11/07 职场文书