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 相关文章推荐
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
解决ajax+php中文乱码的方法详解
Jun 09 PHP
浅析PHP Socket技术
Aug 02 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
php使用json_encode对变量json编码
Apr 07 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
php数组分页实现方法
Apr 30 PHP
YII框架批量插入数据的方法
Mar 18 PHP
php 使用curl模拟ip和来源进行访问的实现方法
May 02 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
Apr 04 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
Apr 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支持页面回退的两种方法
2008/01/10 PHP
PHP提取中文首字母
2008/04/09 PHP
PHP实现会员账号单唯一登录的方法分析
2019/03/07 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
JavaScript中常见的字符串操作函数及用法汇总
2015/05/04 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
Vue——解决报错 Computed property "****" was assigned to but it has no setter.
2020/12/19 Vue.js
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
django下创建多个app并设置urls方法
2020/08/02 Python
css3媒体查询中device-width和width的区别详解
2020/03/27 HTML / CSS
KIKO美国官网:意大利的平价彩妆品牌
2017/05/16 全球购物
医学检验专业大学生求职信
2013/11/18 职场文书
三月法制宣传月活动总结
2014/07/03 职场文书
小学重阳节活动总结
2015/03/24 职场文书
《火烧云》教学反思
2016/02/23 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis