文档章节

PHP中spl_autoload_register函数的用法

121137141
 121137141
发布于 2013/04/10 11:14
字数 794
阅读 94
收藏 3

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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的类:

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

<?php
class A
{
public function __construct()
{
echo 'Got it.';
}
}
然后我们有一个index.php需要用到这个类A,常规的写法就是

view plaincopy to clipboardprint?
<?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可以这样写:

view plaincopy to clipboardprint?
<?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] )

我们继续改写上面那个例子:

view plaincopy to clipboardprint?
<?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了。同样的道理,下面这种写法也是可以的:

view plaincopy to clipboardprint?
<?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();

© 著作权归作者所有

121137141
粉丝 1
博文 7
码字总数 12738
作品 0
黄石
程序员
私信 提问
PHP中spl_autoload_register函数的用法

PHP中splautoloadregister函数的用法 splautoloadregister (PHP 5 >= 5.1.2) splautoloadregister — 注册autoload()函数 说明 bool splautoloadregister ([ callback $autoload_function ] ......

net ljx
2012/10/25
68
0
PHP 中的__autoload() 与spl_autoload_register()函数

autoload()函数可以实现自动加载所需要的类 用法: autoload() 在实例化对象时,若没有引入相关的文件,就会自动调用这个方法来进行加载。 实例: public function autoload($className){ $a...

噢_我想多了
2015/09/25
210
0
自动加载函数流程之composer autoload_real.php

我们探索了 从 1 app/public/index.php 开始 2 加载 bootstrap /autoload.php 文件 3 然后加载到 vendor / autoload.php文件 4 然后终于找到了 /vendor/composer/autoload_real.php 文件 终于......

就是想好看
2017/05/26
0
0
类自定载入

为什么需要类自动加载机制 原因: 在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来。这个在小规模开发的时候,没什么大问...

金于虎
2016/11/15
10
0
PHP的autoLoad自动加载机制 的几种方式

说说PHP的autoLoad自动加载机制 php的autoload大致可以使用两种方法:autoload和spl方法。这两种方法又各有不同的几种使用方法 autoload的使用方法1: 最经常使用的就是这种方法,根据类名,...

daniel-john
2015/08/27
66
0

没有更多内容

加载失败,请刷新页面

加载更多

x005-构造程序逻辑

构造程序逻辑 结合生活例子运用程序语言 百钱百鸡是我国古代数学家张丘建在《算经》一书中提出的数学问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何...

伟大源于勇敢的开始
36分钟前
3
0
问题汇总

最近在补知识面的时候发现有几个问题, 第一个呢是 教程 没有提前准备好。(视频方面的吧 书上面的 都要有) 第二个呢是 ,开发工具太多了,搞不清楚到底用哪个了 和哪个教程相匹配。 第三个...

T型人才追梦者
今天
7
0
OSChina 周三乱弹 —— 我以前超喜欢晒太阳的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @watergood :分享海先生的单曲《东篱》: 《东篱》- 海先生 手机党少年们想听歌,请使劲儿戳(这里) @xiaoshiyue :早.先喝几大碗鸡汤 @小小...

小小编辑
今天
18
1
法国电力项目二期正式验收

2019年12月10日, 法国电力项目二期正式验收. 二期实现了一个个人能源的自交易/自管理APP + 管理后台。 并就未来的合作技术方向进行了探讨: 去中心化数据存储/搜索引擎 可信计算/零知识证明...

怎当她临去时秋波那一转
今天
13
0
索引延迟关联

前言 今天在看代码的时候学习到了一种索引的优化,就先在此记录下来。 具体 举个例子,原sql如下: SELECT * FROM TABLE WHERE INDEX = '' LIMIT 10000, 10; 现象 就算INDEX用了查询索引,...

无敌小杰杰
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部