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 需要掌握的东西 不做浮躁的人
Dec 28 PHP
一组PHP可逆加密解密算法实例代码
Jan 21 PHP
PHP获取客户端真实IP地址的5种情况分析和实现代码
Jul 08 PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 PHP
php开发中的页面跳转方法总结
Apr 26 PHP
使用PHP uniqid函数生成唯一ID
Nov 18 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
tp5框架使用composer实现日志记录功能示例
Jan 10 PHP
laravel 事件/监听器实例代码
Apr 12 PHP
php操作redis数据库常见方法实例总结
Feb 20 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断点续传之如何分割合并文件
2014/03/22 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
原型方法的不同写法居然会影响调试的解决方法
2007/03/08 Javascript
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
jquery获取div宽度的实现思路与代码
2013/01/13 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
jquery隐藏标签和显示标签的实例
2013/11/11 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
Js实现滚动变色的文字效果
2014/06/16 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
angular1配合gulp和bower的使用教程
2018/01/19 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
Python 将RGB图像转换为Pytho灰度图像的实例
2017/11/14 Python
Python设计模式之工厂模式简单示例
2018/01/09 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
python保存二维数组到txt文件中的方法
2018/11/15 Python
python 通过视频url获取视频的宽高方式
2019/12/10 Python
Python restful框架接口开发实现
2020/04/13 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
python 元组的使用方法
2020/06/09 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
节约粮食标语
2014/06/18 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
责任书格式
2015/01/29 职场文书