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的FTP学习(二)[转自奥索]
Oct 09 PHP
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
PHP中的Memcache详解
Apr 05 PHP
php检测数组长度函数sizeof与count用法
Nov 17 PHP
php数组添加元素方法小结
Dec 20 PHP
php类的定义与继承用法实例
Jul 07 PHP
PHP指定截取字符串中的中英文或数字字符的实例分享
Mar 18 PHP
PHP实现的回溯算法示例
Aug 15 PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 PHP
Laravel框架实现文件上传的方法分析
Sep 29 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 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
PHP中将字符串转化为整数(int) intval() printf() 性能测试
2020/03/20 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
日常整理PHP中简单的图形处理(经典)
2015/10/26 PHP
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
动态加载js、css等文件跨iframe实现
2014/02/24 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
2016/08/05 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
js 获取json数组里面数组的长度实例
2017/10/31 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
2017/12/14 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
2019/07/15 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
详解Python的单元测试
2015/04/28 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
django-利用session机制实现唯一登录的例子
2020/03/16 Python
基于Django快速集成Echarts代码示例
2020/12/01 Python
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
HTML5 通过Vedio标签实现视频循环播放的示例代码
2020/08/05 HTML / CSS
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
大学生自荐信
2013/12/11 职场文书
三八妇女节活动主持词
2014/03/17 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
2014预防青少年违法犯罪工作总结
2014/12/10 职场文书
2014个人年度工作总结
2014/12/15 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书