PHP中spl_autoload_register()和__autoload()区别分析


Posted in PHP onMay 10, 2014

关于spl_autoload_register()和__autoload(),相信大多数都会选择前者了? 看两者的用法:

//__autoload用法
function __autoload($classname)
{
    $filename = "./class/".$classname.".class.php";
    if (is_file($filename))
    {
        include $filename;
    }
}//spl_autoload_register用法
spl_autoload_register('load_class');
function load_class($classname)
{
    $filename = "./class/".$classname.".class.php";
    if (is_file($filename))
    {
        include $filename;
    }
}

使用spl_autoload_register()的好处是不可言喻的:
(1)自动加载对象更加方便,很多框架都是这样做的:

class ClassAutoloader {
    public function __construct() {
        spl_autoload_register(array($this, 'loader'));
    }
    private function loader($className) {
        echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n";
        include $className . '.php';
    }
}$autoloader = new ClassAutoloader();
$obj = new Class1();
$obj = new Class2();

(2)你要知道__autoload()函数只能存在一次啊,spl_autoload_register()当然能注册多个函数

function a () { 
    include 'a.php';
} 
function b () { 
    include 'b.php';
} 
spl_autoload_register('a'); 
spl_autoload_register('b');

(3)SPL函数很丰富,提供了更多功能,如spl_autoload_unregister()注销已经注册的函数、spl_autoload_functions()返回所有已经注册的函数等。

PHP中spl_autoload_register()和__autoload()区别分析

详见PHP参考手册:关于SPL函数列表.

注意:

如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为
spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload() 或 spl_autoload_call()

/** 
*__autoload 方法在 spl_autoload_register 后会失效,因为 autoload_func 函数指针已指向 spl_autoload 方法 
* 可以通过下面的方法来把 _autoload 方法加入 autoload_functions list 
*/ 
spl_autoload_register( '__autoload' );
PHP 相关文章推荐
php中文本数据翻页(留言本翻页)
Oct 09 PHP
PHP 金额数字转换成英文
May 06 PHP
PHP 反向排序和随机排序代码
Jun 30 PHP
php学习笔记之 函数声明
Jun 09 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
php出现内存位置访问无效错误问题解决方法
Aug 16 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
Apr 14 PHP
php准确计算复活节日期的方法
Apr 18 PHP
php编程每天必学之验证码
Mar 03 PHP
php如何执行非缓冲查询API
Jul 22 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
linux使用crontab实现PHP执行计划定时任务
May 10 #PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
May 10 #PHP
php判断电脑访问、手机访问的例子
May 10 #PHP
php计算程序运行时间的简单例子分享
May 10 #PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 #PHP
php递归删除目录下的文件但保留的实例分享
May 10 #PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
May 10 #PHP
You might like
php下mysql数据库操作类(改自discuz)
2010/07/03 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
PHP+iFrame实现页面无需刷新的异步文件上传
2014/09/16 PHP
php中switch语句用法详解
2015/08/17 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
Laravel框架集合用法实例浅析
2020/05/14 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
javascript背景时钟实现方法
2015/06/18 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
ES6 Generator函数的应用实例分析
2019/06/26 Javascript
antd多选下拉框一行展示的实现方式
2020/10/31 Javascript
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
python实现的守护进程(Daemon)用法实例
2015/06/02 Python
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
使用python绘制温度变化雷达图
2019/10/18 Python
Python: 传递列表副本方式
2019/12/19 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
你懂得怎么写自荐信吗?
2013/12/27 职场文书
校三好学生主要事迹
2014/01/11 职场文书
初中班主任寄语
2014/04/04 职场文书
赔偿协议书范本
2014/04/15 职场文书
监察建议书
2015/02/04 职场文书
公司考勤管理制度
2015/08/04 职场文书
golang定时器
2022/04/14 Golang
SQL Server Agent 服务无法启动
2022/04/20 SQL Server