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设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
PHP中全面阻止SQL注入式攻击分析小结
Jan 30 PHP
php时区转换转换函数
Jan 07 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
php动态生成缩略图并输出显示的方法
Apr 20 PHP
PHP开发Apache服务器配置
Jul 15 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
基于php判断客户端类型
Oct 14 PHP
PHP递归实现汉诺塔问题的方法示例
Nov 25 PHP
php接口隔离原则实例分析
Nov 11 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 PHP
PHP实现倒计时功能
Nov 16 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
第十一节--重载
2006/11/16 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
2019/04/30 PHP
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
2012/11/11 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
JavaScript常用事件介绍
2019/01/21 Javascript
Vue watch响应数据实现方法解析
2020/07/10 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
Python用list或dict字段模式读取文件的方法
2017/01/10 Python
5款非常棒的Python工具
2018/01/05 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
python将时分秒转换成秒的实例
2019/12/07 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
基于Tensorflow批量数据的输入实现方式
2020/02/05 Python
Python要如何实现列表排序的几种方法
2020/02/21 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
解决python运行启动报错问题
2020/06/01 Python
解决python中0x80072ee2错误的方法
2020/07/19 Python
Canvas系列之滤镜效果
2019/02/12 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
Shell如何接收变量输入
2012/09/24 面试题
自主招生自荐信范文
2015/03/04 职场文书
教师工作表现自我评价
2015/03/05 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
my.ini优化mysql数据库性能的十个参数(推荐)
2021/05/26 MySQL
MySQL query_cache_type 参数与使用详解
2021/07/01 MySQL
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL