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
CI框架源码阅读,系统常量文件constants.php的配置
Feb 28 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 PHP
php编程中echo用逗号和用点号连接的区别
Mar 26 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
完美解决phpexcel导出到xls文件出现乱码的问题
Oct 29 PHP
php计算多个集合的笛卡尔积实例详解
Feb 16 PHP
PHP7数组的底层实现示例
Aug 25 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 PHP
Jsonp劫持学习
Apr 01 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
phpmyadmin操作流程
2006/10/09 PHP
php xml-rpc远程调用
2008/12/19 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
javascript打印输出json实例
2013/11/11 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
2015/10/17 Javascript
Html中 IFrame的用法及注意点
2016/12/22 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
AngularJS实现的锚点楼层跳转功能示例
2018/01/02 Javascript
vue实现固定位置显示功能
2019/05/30 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
ES6对象操作实例详解
2020/05/23 Javascript
Vue3为什么这么快
2020/09/23 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
Python中在for循环中嵌套使用if和else语句的技巧
2016/06/20 Python
Python处理文本文件中控制字符的方法
2017/02/07 Python
python 实现视频流下载保存MP4的方法
2019/01/09 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
python 进程的几种创建方式详解
2019/08/29 Python
python 录制系统声音的示例
2020/12/21 Python
泰坦健身器材:Titan Fitness
2018/02/13 全球购物
Europcar意大利:汽车租赁
2019/07/07 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
出生公证委托书
2014/04/03 职场文书
大专学生求职信
2014/07/04 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
村当支部个人对照检查材料思想汇报
2014/10/06 职场文书
消费者投诉书范文
2015/07/02 职场文书
八年级历史教学反思
2016/02/19 职场文书