SPL提供了6个迭代器接口:

Traversable 遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口)
Iterator 迭代器接口(可在内部迭代自己的外部迭代器或类的接口)
IteratorAggregate 聚合式迭代器接口(创建外部迭代器的接口)
OuterIterator 迭代器嵌套接口(将一个或多个迭代器包裹在另一个迭代器中)
RecursiveIterator 递归迭代访问接口(提供递归访问功能)
SeekableIterator 可索引迭代访问接口(实现查找功能)

下面对各种迭代器接口简单介绍一下:

1. Traversable

Traversable接口实际上不是一个接口,在实际写php代码中不能用。因为只有内部的PHP类(用C写的类)才可以直接实现Traversable接口。可以说这是个特性级别的东西。实际的PHP编程中我们使用Iterator接口或者IteratorAggregate接口来实现遍历。

1 Traversable {
2 }

Traversable 接口不能直接实现(implements).Traversable 重要的一个用处就是判断一个类是否可以遍历:

1 if($class instanceof Traversable)
2 {
3      //foreach...
4 }

下面是官方例子:

1 <?php
2     if( !is_array$items ) && !$items instanceof Traversable )
3         //Throw exception here
4 ?>

2. Iterator

Iterator接口的主要用途是允许一个类实现一个基本的迭代功能,从而使它可以被循环访问,根据键值访问以及回滚。Iterator接口摘要如下:

01 Iterator extends Traversable 
02
03     //返回当前索引游标指向的元素 
04     abstract public mixed current(void) 
05     //返回当前索引游标指向的元素的键名 
06     abstract public scalar key(void) 
07     //移动当前索引游标指向下一元素 
08     abstract public void next(void) 
09     //重置索引游标的指向第一个元素 
10     abstract public void rewind(void) 
11     //判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用 
12     abstract public boolean valid(void) 
13 }

外部迭代器接口,实现该接口的对象可以迭代自己内部的数据。

Iterator 的例子这里就不再列举了,本专题前面部分以后后续有很多例子,具体请自行查看。

3. IteratorAggregate

又叫聚合式迭代器。创建外部迭代器的接口,其摘要如下:

1 IteratorAggregate extends Traversable { 
2     //实现该方法时,必须返回一个实现了Iterator接口的类的实例 
3     abstract public Traversable getIterator ( void ) 
4 }

其中getIterator 方法返回值必须是能遍历或实现Iterator接口(must be traversable or implement interface Iterator)。SPL还提供了一些专门用来与IteratorAggregate接口一起使用的内置迭代器。使用这些迭代器意味着只需要实现一个方法并实例化一个类就可以使对象可以迭代访问了。

实例:

01 /**
02 * @author 简明现代魔法 http://www.nowamagic.net
03 */
04 class myData implements IteratorAggregate 
05
06     public $property1 "公共属性1"
07     public $property2 "公共属性2"
08     public $property3 "公共属性3"
09    
10     public function __construct() 
11     
12         $this->property4 = "最后一个公共属性"
13     
14    
15     public function getIterator() 
16     
17         return new ArrayIterator($this); 
18     
19
20    
21 $obj new myData; 
22 foreach ($obj as $key => $value) { 
23     echo "键名:{$key}  值:{$value}\n"
24 }

程序输出:

1 键名:property1  值:公共属性1
2 键名:property2  值:公共属性2
3 键名:property3  值:公共属性3
4 键名:property4  值:最后一个公共属性

4. ArrayAccess

数组式访问接口。实现该接口的对象能像数组一样使用:

1 ArrayAccess {
2     /* Methods */
3     abstract public boolean offsetExists ( mixed $offset )
4     abstract public mixed offsetGet ( mixed $offset )
5     abstract public void offsetSet ( mixed $offset , mixed $value )
6     abstract public void offsetUnset ( mixed $offset )
7 }
  • ArrayAccess::offsetExists — 检查一个偏移位置是否存在
  • ArrayAccess::offsetGet — 获取一个偏移位置的值
  • ArrayAccess::offsetSet — 设置一个偏移位置的值
  • ArrayAccess::offsetUnset — 复位一个偏移位置的值

举个栗子:

01 /**
02 * @author 简明现代魔法 http://www.nowamagic.net
03 */
04 class obj implements arrayaccess {
05     private $container array();
06     public function __construct() {
07         $this->container = array(
08             "one"   => 1,
09             "two"   => 2,
10             "three" => 3,
11         );
12     }
13     public function offsetSet($offset$value) {
14         if (is_null($offset)) {
15             $this->container[] = $value;
16         else {
17             $this->container[$offset] = $value;
18         }
19     }
20     public function offsetExists($offset) {
21         return isset($this->container[$offset]);
22     }
23     public function offsetUnset($offset) {
24         unset($this->container[$offset]);
25     }
26     public function offsetGet($offset) {
27         return isset($this->container[$offset]) ? $this->container[$offset] : null;
28     }
29 }
30  
31 $obj new obj;
32  
33 var_dump(isset($obj["two"]));
34 var_dump($obj["two"]);
35 unset($obj["two"]);
36 var_dump(isset($obj["two"]));
37 $obj["two"] = "A value";
38 var_dump($obj["two"]);
39 $obj[] = 'Append 1';
40 $obj[] = 'Append 2';
41 $obj[] = 'Append 3';
42 print_r($obj);

5. Serializable

序列化接口。实现该接口的类不能使用__sleep() 和__wakeup().在serialize时不执行__destruct(),在unserialize不执行__construct()。

1 Serializable {
2     /* Methods */
3     abstract public string serialize ( void )
4     abstract public mixed unserialize ( string $serialized )
5 }

实现此接口的类将不再支持 __sleep() 和 __wakeup()。不论何时,只要有实例需要被序列化,serialize 方法都将被调用。它将不会调用 __destruct() 或有其他影响,除非程序化地调用此方法。当数据被反序列化时,类将被感知并且调用合适的 unserialize() 方法而不是调用 __construct()。如果需要执行标准的构造器,你应该在这个方法中进行处理。

  • Serializable::serialize — 对象的字符串表示
  • Serializable::unserialize — 构造对象
1 Serializable {
2     /* Methods */
3     abstract public string serialize ( void )
4     abstract public mixed unserialize ( string $serialized )
5 }

例子:

01 class obj implements Serializable {
02     private $data;
03     public function __construct() {
04         $this->data = "My private data";
05     }
06     public function serialize() {
07         return serialize($this->data);
08     }
09     public function unserialize($data) {
10         $this->data = unserialize($data);
11     }
12     public function getData() {
13         return $this->data;
14     }
15 }
16  
17 $obj new obj;
18 $ser = serialize($obj);
19  
20 $newobj = unserialize($ser);
21  
22 var_dump($newobj->getData());

6. Closure

1 Closure {
2     /* 方法 */
3     __construct ( void )
4     public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope 'static' ] )
5     public Closure bindTo ( object $newthis [, mixed $newscope 'static'] )
6 }

这个具体还没研究,具体可以去看官方文档:http://www.php.net/manual/en/reserved.interfaces.php

PHP Predefined Interfaces 预定义接口(转)的更多相关文章

  1. PHP Predefined Interfaces 预定义接口

    SPL提供了6个迭代器接口: Traversable 遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口) Iterator 迭代器接口(可在内部迭代自己的外部迭代器或类的接口) Ite ...

  2. PHP预定义接口之 ArrayAccess

    最近这段时间回家过年了,博客也没有更新,感觉少学习了好多东西,也错失了好多的学习机会,就像大家在春节抢红包时常说的一句话:一不留神错过了好几亿.废话少说,这篇博客给大家说说关于PHP预定义接口中常用到 ...

  3. 深入理解PHP数组函数和预定义接口

    一. PHP对数组的过滤 函数: array_filter(p1[,p2]) 参数p1是要过滤的数组,参数p2是自定义过滤会掉函数(可以是匿名函数) 例子: <?php $arr = ['',n ...

  4. 深入理解 PHP 的 7 个预定义接口

    深入理解预定义接口 场景:平常工作中写的都是业务模块,很少会去实现这样的接口,但是在框架里面用的倒是很多.   1. Traversable(遍历)接口 该接口不能被类直接实现,如果直接写了一个普通类 ...

  5. PHP预定义接口

    目录 引言 IteratorAggregate(聚合式aggregate迭代器Iterator) Countable ArrayAccess Iterator 总结 引言 在PHP中有好几个预定义的接 ...

  6. php 预定义接口

    Traversable Traversable { } 作用:检测一个类是否可以使用 foreach 进行遍历的接口. php代码中不能用.只有内部的PHP类(用C写的类)才可以直接实现Travers ...

  7. 预定义接口-迭代器Iterator

    <?php /* 可在内部迭代自己的外部迭代器或类的接口. Iterator extends Traversable { abstract public mixed current ( void ...

  8. Flink Pre-defined Timestamp Extractors / Watermark Emitters(预定义的时间戳提取/水位线发射器)

    https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/event_timestamp_extractors.html 根据官网 ...

  9. oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误

    oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...

随机推荐

  1. phpcms V9 数据模型基类(转)

    转自:http://www.cnblogs.com/Braveliu/p/5100421.html 在学习<phpcms V9首页模板文件解析>的第七步,我们看到content_model ...

  2. Java 可变参数

    java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持 ...

  3. Bootstrap_Javascript_图片轮播

    一 . 结构分析 一个轮播图片主要包括三个部分: ☑ 轮播的图片 ☑ 轮播图片的计数器 ☑ 轮播图片的控制器 第一步:设计轮播图片的容器.在 Bootstrap 框架中采用 carousel 样式,并 ...

  4. BZOJ 2423 最长公共子序列

    Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0, ...

  5. [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】

    题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + S ...

  6. Robot Motion

    Description A robot has been programmed to follow the instructions in its path. Instructions for the ...

  7. Hash unique和Sort unique

    SQL> set linesize 200 SQL> set pagesize 200 SQL> set autot trace SQL> select distinct de ...

  8. 【HDOJ】3419 The Three Groups

    记忆化搜索. /* 3419 */ #include <cstdio> #include <cstring> #include <cstdlib> #define ...

  9. Qt入门(18)——使用信号和槽连接控件

    下面显示了如何使用信号和槽来创建自定义窗口部件,和如何使用更加复杂的方式把它们连接起来. 首先,源文件被我们分成几部分并放在放在t7目录下. t7/lcdrange.h包含LCDRange类定义.t7 ...

  10. HDU 1269 迷宫城堡 【强联通分量(模版题)】

    知识讲解: 在代码里我们是围绕 low 和 dfn 来进行DFS,所以我们务必明白 low 和 dfn 是干什么的? 有什么用,这样才能掌握他.   1.  dfn[]  遍历到这个点的时间 2.   ...