PHP SPL标准库总共有6个接口,如下所示:

可数的1。

2.outeriterator

3.recursiveiterator

4.seekableiterator

5.splobserver

6.splsubject

outeriterator,recursiveiterator,和SeekableIterator都是从迭代器类继承,并利用各界面的功能将在下面详细解释。

coutable接口:

实现可计算接口的对象可用于计算计数()函数。

复制代码代码如下所示:

类mycount实现可数

{

公共功能计数()

{

静态$ = 0;

数+;

返回$计数;

}

}



$count =新mycount();

计算数();

计算数();



回声计数($计数);3

回声计数($计数);4



解释uff1a

当计数()函数被调用时,该mycount::计数的方法称为()

计数()函数的第二个参数不会产生影响。

outeriterator接口:

自定义或修改迭代过程。

复制代码代码如下所示:

/ / iteratoriterator是一个outeriterator实现类

类myouteriterator延伸iteratoriterator {



公共函数电流()

{

母:():返回当前测试;

}

}



foreach(新myouteriterator(New ArrayIterator({ B,A,C})为关键)= >美元值){

回声键->美元美元的价值。php_eol;

}

*

结果uff1a

0 - >测试

1 - >测试

2>C

* /



在实际使用中,outeriterator是非常有用的:

复制代码代码如下所示:

$ db =新PDO('mysql:主机为localhost;北京测试,'root ','mckee);

为数据库->查询(让名字utf8);

美元美元->查询PDOStatement =分贝('select * test1,PDO::fetch_assoc);

迭代器=新iteratoriterator美元(约合PDOStatement);

tenrecordarray = iterator_to_array美元($迭代器);

print_r($ tenrecordarray);



recursiveiterator接口:

迭代迭代的多层结构的数据,RecursiveIterator还提供了两个方法:

recursiveiterator::方法获取当前元素的迭代器

recursiveiterator::儿童是否有当前元素的迭代器

复制代码代码如下所示:

myrecursiveiterator recursiveiterator类实现

{

私人_data美元;

私人_position = 0美元;



公共功能__construct(数组数据){

美元-> _data = $数据;

}



公共函数有效(){

返回isset(美元->美元-> _position _data { });

}



公共功能的儿童(){

返回is_array(美元->美元-> _position _data { });

}



公共函数下一步(){

美元-> _position + +;

}



公共函数当前(){

返回_data美元->美元-> _position } {;

}



公共职能getChildren(){

print_r(美元->美元-> _position _data { });

}



公共函数倒带(){

美元-> _position = 0;

}



公共函数键(){

返回_position美元->;

}

}



$ ARR =阵列(0, 1 = >,阵列(10, 20, 2,3)=阵列(1, 2));

MRI =新myrecursiveiterator美元($ ARR);



foreach($ MRI $c = $ V){

如果($ MRI ->儿童()){

回声C美元的孩子:。php_eol;

$ MRI -> getChildren();

{人}

回声$ V。php_eol;

}



}

*

结果uff1a

零

1有孩子:

阵列

(

{ 0 } = 10

{ 1 } = 20

)

二

3有孩子:

阵列

(

{ 0 } = 1

{ 1 } = 2

)

* /



seekableiterator接口:

一个可搜索的迭代器是通过查找()方法实现的,该方法用于搜索某个位置下的元素。

复制代码代码如下所示:

类myseekableiterator实现seekableiterator {



私人$位置= 0;



私有数组=数组(

第一个元素

第二个元素

第三元素

第四个元素

);



公共函数查找($位置){

如果(!isset(美元->数组{ $位置})){

把新的outofboundsexception(无效的搜索位置(地位));

}



此位置= $位置;

}



公共函数倒带(){

$ = >位置= 0;

}



公共函数当前(){

返回这个数组;

}



公共函数键(){

返回$此位置;

}



公共函数下一步(){

$ + + >位置;

}



公共函数有效(){

返回isset(美元->阵列->位置{美元});

}

}



{试



它为新的myseekableiterator美元;

它(当前,)>;



$,寻求(2);

它(当前,)>;



$,寻求(1);

它(当前,)>;



$,寻求(10);



} catch(outofboundsexception e){

echo $ E(GetMessage)->;

}

*

结果uff1a

第一单元

第三元

二元

无效查找位置(10)

* /



splobserver和splsubject接口:

splobserver和splsubject之间的接口是用来实现Observer设计模式。观测器设计模式是当一个类的状态发生变化时,它的依赖对象将被通知和更新。例如,当一个事件发生时,它需要更新多个逻辑操作。传统的做法是在添加事件后编译逻辑。这种代码很难维护,观察者模式可以实现低耦合通知和更新机制。

看看SplSubject splobserver和界面结构:

复制代码代码如下所示:

观察 / / splsubject结构对象

接口splsubject {

公共功能的高度(splobserver $ / /观察);添加观测器

公共职能分离(splobserver $观测器; / /删除)观察员

公共函数(通知);

}



/ / splobserver结构的观察

接口splobserver {

更新函数(splsubject $); / /更新操作

}



请看下面的观察者实现示例:

复制代码代码如下所示:

类主体splsubject

{

私人$观察员=阵列();



公共功能的高度(splobserver $观察)

{

$ $ >观察员;

}



公共职能分离(splobserver $观察)

{

如果(美元指数= array_search($美元->观察员,观察员,真)){

unset(美元->观察员{ $指数});

}

}



公共函数通知()

{

foreach(美元美元->观察员Observer){

观察者> >更新($此);

}

}





}



observer1 splobserver类实现

{

更新函数(splsubject为主题)

{

回声逻辑1码。php_eol;

}

}



observer2 splobserver类实现

{

更新函数(splsubject为主题)

{

回声逻辑2码。php_eol;

}

}





主语=新主语();

$ ->附加(新observer1());

$ ->附加(新observer2());



$主题>通知();

*

结果uff1a

逻辑1码

逻辑2码

* /