spl_autoload_register与autoload的区别详解


Posted in PHP onJune 03, 2013

spl_autoload_register
(PHP 5 >= 5.1.2)
spl_autoload_register — 注册__autoload()函数
说明
bool spl_autoload_register ([ callback $autoload_function ] )
将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。
如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为
spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或
spl_autoload_call()。
参数
autoload_function
欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数
spl_autoload()。
返回值
如果成功则返回 TRUE,失败则返回 FALSE。
注:SPL是Standard PHP  Library(标准PHP库)的缩写。它是PHP5引入的一个扩展库,其主要功能包括autoload机制的实现及包括各种Iterator接口或类。SPL  autoload机制的实现是通过将函数指针autoload_func指向自己实现的具有自动装载功能的函数来实现的。SPL有两个不同的函数spl_autoload,  spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制。
范例
设我们有一个类文件A.php,里面定义了一个名字为A的类:

<?php
class A
{
public function __construct()
{
echo 'Got it.';
}
}

然后我们有一个index.php需要用到这个类A,常规的写法就是
<?php
require('A.php');
$a = new A();

但是有一个问题就是,假如我们的index.php需要包含的不只是类A,而是需要很多类,这样子就必须写很多行require语句,有时候也会让人觉得不爽。
不过在php5之后的版本,我们就不再需要这样做了。在php5中,试图使用尚未定义的类时会自动调用autoload函数,所以我们可以通过编写__autoload函数来让php自动加载类,而不必写一个长长的包含文件列表。
例如在上面那个例子中,index.php可以这样写:
<?php
function __autoload($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
$a = new A();

当然上面只是最简单的示范,__autoload只是去include_path寻找类文件并加载,我们可以根据自己的需要定义__autoload加载类的规则。
此外,假如我们不想自动加载的时候调用__autoload,而是调用我们自己的函数(或者类方法),我们可以使用spl_autoload_register来注册我们自己的autoload函数。它的函数原型如下:
bool spl_autoload_register ( [callback $autoload_function] )
我们继续改写上面那个例子:
<?php
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');
$a = new A();

这样子也是可以正常运行的,这时候php在寻找类的时候就没有调用__autoload而是调用我们自己定义的函数loader了。同样的道理,下面这种写法也是可以的:
<?php   
class Loader   
{   
public static function loadClass($class)   
{   
$file = $class . '.php';   
if (is_file($file)) {   
require_once($file);   
}   
}   
}   
spl_autoload_register(array('Loader', 'loadClass'));   
$a = new A();

PHP 相关文章推荐
提升PHP速度全攻略
Oct 09 PHP
PHP 字符串 小常识
Jun 05 PHP
php下保存远程图片到本地的办法
Aug 08 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
php实例分享之html转为rtf格式
Jun 02 PHP
php中通过DirectoryIterator删除整个目录的方法
Mar 13 PHP
详解PHP中instanceof关键字及instanceof关键字有什么作用
Nov 05 PHP
PHP静态成员变量和非静态成员变量详解
Feb 14 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
Oct 25 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
Jun 06 PHP
PHP实现的解汉诺塔问题算法示例
Aug 06 PHP
基于Linux调试工具strace与gdb的常用命令总结
Jun 03 #PHP
linux命令之调试工具strace的深入分析
Jun 03 #PHP
如何使用Strace调试工具
Jun 03 #PHP
鸡肋的PHP单例模式应用详解
Jun 03 #PHP
phpize的深入理解
Jun 03 #PHP
PHP不用第三变量交换2个变量的值的解决方法
Jun 02 #PHP
基于php socket(fsockopen)的应用实例分析
Jun 02 #PHP
You might like
第十五节--Zend引擎的发展
2006/11/16 PHP
解析PHP获取当前网址及域名的实现代码
2013/06/23 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP实现创建微信自定义菜单的方法示例
2017/07/14 PHP
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
2014/06/09 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
javascript实现抢购倒计时程序
2019/08/26 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
Python程序设计入门(3)数组的使用
2014/06/16 Python
Python实现周期性抓取网页内容的方法
2015/11/04 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
基于Django统计博客文章阅读量
2019/10/29 Python
Python常用外部指令执行代码实例
2020/11/05 Python
selenium如何定位span元素的实现
2021/01/13 Python
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
化工专业大学生职业生涯规划书
2014/01/14 职场文书
司机岗位职责说明书
2014/07/29 职场文书
外科护士长工作总结
2015/08/12 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
南阳市白酒市场的调查报告
2019/11/08 职场文书
python中requests库+xpath+lxml简单使用
2021/04/29 Python