PHP SPL标准库有一下接口:

  • Countable
  • OuterIterator
  • RecursiveIterator
  • SeekableIterator
  • SplObserver
  • SplSubject
  • ArrayObject

其中OuterIterator、RecursiveIterator、SeekableIterator都是继承Iterator类的。

Coutable接口:

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

class Mycount implements Countable
{
public function count()
{
static $count = 0;
$count++;
return $count;
}
} $count = new Mycount();
$count->count();
$count->count(); echo count($count); //3
echo count($count); //4

说明:

调用 count() 函数时,Mycount::count() 方法被调用,count() 函数的第二个参数将不会产生影响。

OuterIterator接口:

它是自定义或修改迭代过程。

// IteratorIterator是OuterIterator的一个实现类
class MyOuterIterator extends IteratorIterator {
public function current()
{
return parent::current() . 'TEST';
}
} foreach(new MyOuterIterator(new ArrayIterator(['b','a','c'])) as $key => $value) {
echo "$key->$value".PHP_EOL;
} /*
结果:
0->bTEST
1->aTEST
2->cTEST
*/

在实际应用中,OuterIterator非常有用:

$db = new PDO('mysql:host=localhost;dbname=test', 'root', 'mckee');
$db->query('set names utf8');
$pdoStatement = $db->query('SELECT * FROM test1', PDO::FETCH_ASSOC);
$iterator = new IteratorIterator($pdoStatement);
$tenRecordArray = iterator_to_array($iterator);
print_r($tenRecordArray);

RecursiveIterator接口:

用于循环迭代多层结构的数据,RecursiveIterator另外提供了两个方法:

RecursiveIterator::getChildren:获取当前元素下子迭代器

RecursiveIterator::hasChildren:判断当前元素下是否有迭代器

class MyRecursiveIterator implements RecursiveIterator
{
private $_data;
private $_position = 0; public function __construct(array $data) {
$this->_data = $data;
} public function valid() {
return isset($this->_data[$this->_position]);
} public function hasChildren() {
return is_array($this->_data[$this->_position]);
} public function next() {
$this->_position++;
} public function current() {
return $this->_data[$this->_position];
} public function getChildren() {
print_r($this->_data[$this->_position]);
} public function rewind() {
$this->_position = 0;
} public function key() {
return $this->_position;
}
} $arr = array(0, 1=> array(10, 20), 2, 3 => array(1, 2));
$mri = new MyRecursiveIterator($arr); foreach ($mri as $c => $v) {
if ($mri->hasChildren()) {
echo "$c has children: " .PHP_EOL;
$mri->getChildren();
} else {
echo "$v" .PHP_EOL;
}
}

输出结果:

0
1 has children:
Array
(
[0] => 10
[1] => 20
)
2
3 has children:
Array
(
[0] => 1
[1] => 2
)

SeekableIterator接口:

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

class  MySeekableIterator  implements  SeekableIterator  {
private $position = 0; private $array = array(
"first element" ,
"second element" ,
"third element" ,
"fourth element"
); public function seek ( $position ) {
if (!isset( $this -> array [ $position ])) {
throw new OutOfBoundsException ( "invalid seek position ( $position )" );
} $this -> position = $position ;
} public function rewind () {
$this -> position = 0 ;
} public function current () {
return $this -> array [ $this -> position ];
} public function key () {
return $this -> position ;
} public function next () {
++ $this -> position ;
} public function valid () {
return isset( $this -> array [ $this -> position ]);
}
} try{
$it = new MySeekableIterator ;
echo $it -> current (), "\n" ; $it -> seek ( 2 );
echo $it -> current (), "\n" ; $it -> seek ( 1 );
echo $it -> current (), "\n" ; $it -> seek ( 10 );
}catch( OutOfBoundsException $e ){
echo $e -> getMessage ();
}

输出结果:

first element
third element
second element
invalid seek position ( 10 )

SplObserver和SplSubject接口:

SplObserver和SplSubject接口用来实现观察者设计模式,观察者设计模式是指当一个类的状态发生变化时,依赖它的对象都会收到通知并更新。使用场景非常广泛,比如说当一个事件发生后,需要更新多个逻辑操作,传统方式是在事件添加后编写逻辑,这种代码耦合并难以维护,观察者模式可实现低耦合的通知和更新机制。

SplObserver和SplSubject的接口结构:

// SplSubject结构 被观察的对象
interface SplSubject{
public function attach(SplObserver $observer); // 添加观察者
public function detach(SplObserver $observer); // 剔除观察者
public function notify(); // 通知观察者
} // SplObserver结构 代表观察者
interface SplObserver{
public function update(SplSubject $subject); // 更新操作
}

看下面一个实现观察者的例子:

class Subject implements SplSubject
{
private $observers = array(); public function attach(SplObserver $observer)
{
$this->observers[] = $observer;
} public function detach(SplObserver $observer)
{
if($index = array_search($observer, $this->observers, true)) {
unset($this->observers[$index]);
}
} public function notify()
{
foreach($this->observers as $observer) {
$observer->update($this);
}
}
} class Observer1 implements SplObserver
{
public function update(SplSubject $subject)
{
echo "逻辑1代码".PHP_EOL;
}
} class Observer2 implements SplObserver
{
public function update(SplSubject $subject)
{
echo "逻辑2代码".PHP_EOL;
}
} $subject = new Subject();
$subject->attach(new Observer1());
$subject->attach(new Observer2()); $subject->notify();

运行结果:

逻辑1代码
逻辑2代码

ArrayObject接口:

ArrayObject 是将数组转换为数组对象。

// 返回当前数组元素
ArrayIterator::current( void ) // 返回当前数组key
ArrayIterator::key(void) // 指向下个数组元素
ArrayIterator::next (void) // 重置数组指针到头
ArrayIterator::rewind(void ) // 查找数组中某一位置
ArrayIterator::seek() // 检查数组是否还包含其他元素
ArrayIterator::valid() // 添加新元素
ArrayObject::append() // 构造一个新的数组对象
ArrayObject::__construct() // 返回迭代器中元素个数
ArrayObject::count() // 从一个数组对象构造一个新迭代器
ArrayObject::getIterator() // 判断提交的值是否存在
ArrayObject::offsetExists(mixed index ) // 指定 name 获取值
ArrayObject::offsetGet() // 修改指定 name 的值
ArrayObject::offsetSet() // 删除数据
ArrayObject::offsetUnset()

实现例子1:

$array =array('1'=>'one', '2'=>'two', '3'=>'three');
// 构造一个ArrayObject对象
$arrayobject = new ArrayObject($array);
for( $iterator= $arrayobject->getIterator();// 构造一个迭代器
$iterator->valid(); // 检查是否还含有元素
$iterator->next() ){ // 指向下个元素
echo $iterator->key() . ' => ' . $iterator->current() . "\n"; // 打印数组元素
}

输出结果:

1 => one 2 => two 3 => three

实现例子2:

$arrayobject =new ArrayObject();
$arrayobject[] = 'zero';
$arrayobject[] = 'one';
$arrayobject[] = 'two';
$iterator= $arrayobject->getIterator();
$iterator->next();
echo $iterator->key()."<br>";
// 重置指针到头部
$iterator->rewind();
echo $iterator->key();

输出结果:

1
0

PHP SPL标准库-接口的更多相关文章

  1. php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便)

    php spl标准库简介(SPL是Standard PHP Library(PHP标准库)(直接看代码实例,特别方便) 一.总结 直接看代码实例,特别方便易懂 thinkphp控制器利眠宁不支持(说明 ...

  2. PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题)

    PHP SPL标准库之数据结构栈(SplStack)介绍(基础array已经可以解决很多问题了,现在开始解决问题) 一.总结 SplStack就是继承双链表(SplDoublyLinkedList)实 ...

  3. PHP的SPL标准库里面的堆(SplHeap)怎么使用

    PHP的SPL标准库里面的堆(SplHeap)怎么使用 一.总结 1.因为SplHeap是抽象类,所以要先继承,实现里面的抽象方法compare后,才能new对象使用. 二.PHP的SPL标准库里面的 ...

  4. 【SPL标准库专题(1)】 SPL简介

    什么是SPL SPL是Standard PHP Library(PHP标准库)的缩写. 根据官方定义,它是"a collection of interfaces and classes th ...

  5. PHP 设计模式 笔记与总结(3)SPL 标准库

    SPL 库的使用(PHP 标准库) 1. SplStack,SplQueue,SplHeap,SplFixedArray 等数据结构类 ① 栈(SplStack)(先进后出的数据结构) index.p ...

  6. PHP的SPL标准库

    1,简介 SPL,全称 Standard PHP Library 中文是 标准PHP类库.是php内置的一些拓展类和拓展接口,其内容包含数据结构.迭代器.接口.异常.SPL函数,文件处理等内容.SPL ...

  7. 【SPL标准库专题(9)】 Datastructures:SplObjectStorage

    PHP SPL SplObjectStorage是用来存储一组对象的,特别是当你需要唯一标识对象的时候. PHP SPL SplObjectStorage类实现了Countable,Iterator, ...

  8. 【SPL标准库专题(3)】 Classes

    我把SPL分为四个部分:Iterator,Classes,Datastructures,Function:而其中classes是就是做一些类的介绍(Iterator与Datastructures相关的 ...

  9. 【SPL标准库专题(2)】 Iterator

    Iterator界面 本段内容来自阮一峰老师再加自己的部分注解 SPL规定,所有部署了Iterator界面的class,都可以用在foreach Loop中.Iterator界面中包含5个必须部署的方 ...

随机推荐

  1. 架构设计 | 基于Seata中间件,微服务模式下事务管理

    源码地址:GitHub·点这里 || GitEE·点这里 一.Seata简介 1.Seata组件 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用 ...

  2. Dos拒绝服务Syn-Flood泛洪攻击--Smurf 攻击(一)

    Dos拒绝服务利用程序漏洞或一对一资源耗尽的Denial of Service 拒绝服务DDos 分布式拒绝服务 多对一 Syn-Flood泛洪攻击 发送syn包欺骗服务器建立半连接 攻击代码,利用s ...

  3. Tomcat http转https

    1.先申请ssl   腾讯  阿里都有免费的一年的 2.修改tomcat  conf文件夹的service.xml文件 <!-- 将所有的8443  改为443 --> <Conne ...

  4. async/await 深度理解使用

    在vue中使用 eg async created () { await setTimeout(()=>{ console.log(1) },5000); }, async mounted () ...

  5. RXJAVA之变换操作

    RXJAVA提供了以下变换操作,对Observable的消息进行变换操作: 1.window 定期将来自Observable的数据分拆成一些Observable窗口,然后发射这些窗口,而不是每次发射一 ...

  6. 龙芯3a4000办公机安装软件及美化记录

    1.硬件平台: CPU:龙芯3a4000 Linux内核版本:4.19.90-1.lns7.2.mips64el 操作系统:Debian 10(buster) 使用过龙芯3a3000和3a4000两款 ...

  7. windows服务器添加磁盘后,提示The disk is offline because of policy set by an administrator的解决办法

    操作系统:Windows Server 2008 R2 Enterprise 事件:存储在虚拟机上添加三块磁盘,笔者准备扩展到E盘(动态分区) 问题:存储团队添加磁盘后,OS的磁盘管理界面,看到提示, ...

  8. jquery学习:

    1.什么是jQuery jquery 全称 javaScript Query.是js的一个框架.本质上仍然是js. 2.jQuery的特点 支持各种主流的浏览器. 使用特别简单 拥有便捷的插件扩展机制 ...

  9. ubuntu 开启samba

    sudo apt-get update sudo apt-get install samba samba-common sudo mkdir /home/vagrant/share sudo chmo ...

  10. 普转提Day1

    T1 给定一个长度为N的序列,去掉其中连续的一部分使得剩下的部分没有重复元素. 很显然可以发现去掉的一部分只有三种情况:开头.中间.最后. 那么我们只需要枚举Hash就可以了.复杂度O(N^2). 不 ...