spl_autoload_register与autoload的区别详解


Posted in PHP onJune 03, 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.';
}
}

然后我们有一个index.php需要用到这个类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();

当然上面只是最简单的示范,__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在寻找类的时候就没有调用__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 相关文章推荐
phplock(php进程锁) v1.0 beta1
Nov 24 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
php自动加载机制的深入分析
Jun 08 PHP
php连接Access数据库错误及解决方法
Jun 20 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
php常用的安全过滤函数集锦
Oct 09 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
php实现生成带二维码图片并强制下载功能
Feb 24 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
实例讲解php实现多线程
Jan 27 PHP
PHP count_chars()函数讲解
Feb 14 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 #PHP
linux命令之调试工具strace的深入分析
Jun 03 #PHP
如何使用Strace调试工具
Jun 03 #PHP
鸡肋的PHP单例模式应用详解
Jun 03 #PHP
phpize的深入理解
Jun 03 #PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 #PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 #PHP
You might like
文件上传的实现
2006/10/09 PHP
php防注
2007/01/15 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
php删除指定目录的方法
2015/04/03 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
在JavaScript中用getMinutes()方法返回指定的分时刻
2015/06/10 Javascript
使用AngularJS实现可伸缩的页面切换的方法
2015/06/19 Javascript
jQuery动态添加
2016/04/07 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
js正则表达式验证密码强度【推荐】
2017/03/03 Javascript
微信小程序用户授权弹窗 拒绝时引导用户重新授权实现
2019/07/29 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
python处理xml文件的方法小结
2017/05/02 Python
python爬虫 使用真实浏览器打开网页的两种方法总结
2018/04/21 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python+mysql实现学生信息查询系统
2019/02/21 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
树莓派升级python的具体步骤
2020/07/05 Python
python集合能干吗
2020/07/19 Python
python中pyqtgraph知识点总结
2021/01/26 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
韩国美国时尚服装和美容在线全球市场:KOODING
2018/11/07 全球购物
项目资料员岗位职责
2013/12/10 职场文书
残疾人小组计划书
2014/04/27 职场文书
公司踏青活动方案
2014/08/16 职场文书
法人授权委托书
2014/09/16 职场文书
关于迟到的检讨书
2015/05/06 职场文书
php png失真的原因及解决办法
2021/11/17 PHP
python中的getter与setter你了解吗
2022/03/24 Python