PHP中spl_autoload_register函数的用法总结


Posted in PHP onNovember 07, 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.';  
}  
}

<?php
class A
{
public function __construct()
{
echo 'Got it.';
}
}
然后我们有一个index.php需要用到这个类A,常规的写法就是
<?php  
require('A.php');  
$a = new 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();

<?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
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 相关文章推荐
生成缩略图
Oct 09 PHP
第二节--PHP5 的对象模型
Nov 16 PHP
php采集时被封ip的解决方法
Aug 29 PHP
php 文本文件的读取效率
Feb 10 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
php代码审计比较有意思的例子
May 07 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
Oct 13 PHP
php查询ip所在地的方法
Dec 05 PHP
详解php与ethereum客户端交互
Apr 28 PHP
php图片裁剪函数
Oct 31 PHP
Yii框架连表查询操作示例
Sep 06 PHP
PHP7 list() 函数修改
Mar 09 PHP
php去除HTML标签实例
Nov 06 #PHP
php实现监听事件
Nov 06 #PHP
php生成扇形比例图实例
Nov 06 #PHP
php多用户读写文件冲突的解决办法
Nov 06 #PHP
php生成图形(Libchart)实例
Nov 06 #PHP
php ZipArchive压缩函数详解实例
Nov 06 #PHP
php根据分类合并数组的方法实例详解
Nov 06 #PHP
You might like
在WAMP环境下搭建ZendDebugger php调试工具的方法
2011/07/18 PHP
php curl模拟post请求小实例
2013/11/13 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
获取当前点击按钮的id用this.id实现
2014/03/17 Javascript
jquery选择器简述
2015/08/31 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
jQuery获取select选中的option的value值实现方法
2016/08/29 Javascript
jQuery查找节点并获取节点属性的方法
2016/09/09 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
Node.js创建Web、TCP服务器
2017/12/05 Javascript
用Node编写RESTful API接口的示例代码
2018/07/04 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
layui递归实现动态左侧菜单
2019/07/26 Javascript
js实现漂亮的星空背景
2019/11/01 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
[02:25]DOTA2英雄基础教程 熊战士
2014/01/03 DOTA
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
python 动态加载的实现方法
2017/12/22 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
Python实现自动签到脚本功能
2020/08/20 Python
HTML5 WebGL 实现民航客机飞行监控系统
2019/07/25 HTML / CSS
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
合作意向协议书范本
2014/03/31 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js
python实现双链表
2022/05/25 Python