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
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
php读取图片内容并输出到浏览器的实现代码
Aug 08 PHP
php中执行系统命令的方法
Mar 21 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
thinkphp jquery实现图片上传和预览效果
Jul 22 PHP
PHP实现执行外部程序的方法详解
Aug 17 PHP
php中上传文件的的解决方案
Sep 25 PHP
php实现数组中出现次数超过一半的数字的统计方法
Oct 14 PHP
PHP读取目录树的实现方法分析
Mar 22 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
Apr 07 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和ACCESS写聊天室(十)
2006/10/09 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
php实现头像上传预览功能
2017/04/27 PHP
纯JS实现动态时间显示代码
2014/02/08 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
使用 UniApp 实现小程序的微信登录功能
2020/06/09 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
JS实现购物车基本功能
2020/11/08 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
Python中的rjust()方法使用详解
2015/05/19 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
python安装oracle扩展及数据库连接方法
2017/02/21 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
2020/02/26 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
最新pycharm安装教程
2020/11/18 Python
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
Unix/Linux开发面试题
2016/08/16 面试题
物理教育专业毕业生推荐信
2013/11/03 职场文书
驾驶员岗位职责
2014/01/29 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
护士的自我鉴定
2014/02/07 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
舞蹈专业求职信
2014/06/13 职场文书
机电一体化应届生求职信
2014/08/09 职场文书
匿名检举信范文
2015/03/02 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
房产电话营销开场白
2015/05/29 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
pandas进行数据输入和输出的方法详解
2022/03/23 Python
Python+Pillow+Pytesseract实现验证码识别
2022/05/11 Python