SPL提供了6个迭代器接口:
| Traversable |
遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口) |
| Iterator |
迭代器接口(可在内部迭代自己的外部迭代器或类的接口) |
| IteratorAggregate |
聚合式迭代器接口(创建外部迭代器的接口) |
| OuterIterator |
迭代器嵌套接口(将一个或多个迭代器包裹在另一个迭代器中) |
| RecursiveIterator |
递归迭代访问接口(提供递归访问功能) |
| SeekableIterator |
可索引迭代访问接口(实现查找功能) |
下面对各种迭代器接口简单介绍一下:
1. Traversable
Traversable接口实际上不是一个接口,在实际写php代码中不能用。因为只有内部的PHP类(用C写的类)才可以直接实现Traversable接口。可以说这是个特性级别的东西。实际的PHP编程中我们使用Iterator接口或者IteratorAggregate接口来实现遍历。
Traversable 接口不能直接实现(implements).Traversable 重要的一个用处就是判断一个类是否可以遍历:
1 |
if($class instanceof Traversable) |
下面是官方例子:
2 |
if( !is_array( $items ) && !$items instanceof Traversable ) |
2. Iterator
Iterator接口的主要用途是允许一个类实现一个基本的迭代功能,从而使它可以被循环访问,根据键值访问以及回滚。Iterator接口摘要如下:
01 |
Iterator extends Traversable |
04 |
abstract public mixed current(void) |
06 |
abstract public scalar key(void) |
08 |
abstract public void next(void) |
10 |
abstract public void rewind(void) |
11 |
//判断当前索引游标指向的是否是一个元素,常常在调用 rewind()或 next()使用 |
12 |
abstract public boolean valid(void) |
外部迭代器接口,实现该接口的对象可以迭代自己内部的数据。
Iterator 的例子这里就不再列举了,本专题前面部分以后后续有很多例子,具体请自行查看。
3. IteratorAggregate
又叫聚合式迭代器。创建外部迭代器的接口,其摘要如下:
1 |
IteratorAggregate extends Traversable { |
2 |
//实现该方法时,必须返回一个实现了Iterator接口的类的实例 |
3 |
abstract public Traversable getIterator ( void ) |
其中getIterator 方法返回值必须是能遍历或实现Iterator接口(must be traversable or implement interface Iterator)。SPL还提供了一些专门用来与IteratorAggregate接口一起使用的内置迭代器。使用这些迭代器意味着只需要实现一个方法并实例化一个类就可以使对象可以迭代访问了。
实例:
04 |
class myData implements IteratorAggregate |
06 |
public $property1 = "公共属性1"; |
07 |
public $property2 = "公共属性2"; |
08 |
public $property3 = "公共属性3"; |
10 |
public function __construct() |
12 |
$this->property4 = "最后一个公共属性"; |
15 |
public function getIterator() |
17 |
return new ArrayIterator($this); |
22 |
foreach ($obj as $key => $value) { |
23 |
echo "键名:{$key} 值:{$value}\n"; |
程序输出:
4 |
键名:property4 值:最后一个公共属性 |
4. ArrayAccess
数组式访问接口。实现该接口的对象能像数组一样使用:
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 ) |
- ArrayAccess::offsetExists — 检查一个偏移位置是否存在
- ArrayAccess::offsetGet — 获取一个偏移位置的值
- ArrayAccess::offsetSet — 设置一个偏移位置的值
- ArrayAccess::offsetUnset — 复位一个偏移位置的值
举个栗子:
04 |
class obj implements arrayaccess { |
05 |
private $container = array(); |
06 |
public function __construct() { |
07 |
$this->container = array( |
13 |
public function offsetSet($offset, $value) { |
14 |
if (is_null($offset)) { |
15 |
$this->container[] = $value; |
17 |
$this->container[$offset] = $value; |
20 |
public function offsetExists($offset) { |
21 |
return isset($this->container[$offset]); |
23 |
public function offsetUnset($offset) { |
24 |
unset($this->container[$offset]); |
26 |
public function offsetGet($offset) { |
27 |
return isset($this->container[$offset]) ? $this->container[$offset] : null; |
33 |
var_dump(isset($obj["two"])); |
34 |
var_dump($obj["two"]); |
36 |
var_dump(isset($obj["two"])); |
37 |
$obj["two"] = "A value"; |
38 |
var_dump($obj["two"]); |
5. Serializable
序列化接口。实现该接口的类不能使用__sleep() 和__wakeup().在serialize时不执行__destruct(),在unserialize不执行__construct()。
3 |
abstract public string serialize ( void ) |
4 |
abstract public mixed unserialize ( string $serialized ) |
实现此接口的类将不再支持 __sleep() 和 __wakeup()。不论何时,只要有实例需要被序列化,serialize 方法都将被调用。它将不会调用 __destruct() 或有其他影响,除非程序化地调用此方法。当数据被反序列化时,类将被感知并且调用合适的 unserialize() 方法而不是调用 __construct()。如果需要执行标准的构造器,你应该在这个方法中进行处理。
- Serializable::serialize — 对象的字符串表示
- Serializable::unserialize — 构造对象
3 |
abstract public string serialize ( void ) |
4 |
abstract public mixed unserialize ( string $serialized ) |
例子:
01 |
class obj implements Serializable { |
03 |
public function __construct() { |
04 |
$this->data = "My private data"; |
06 |
public function serialize() { |
07 |
return serialize($this->data); |
09 |
public function unserialize($data) { |
10 |
$this->data = unserialize($data); |
12 |
public function getData() { |
18 |
$ser = serialize($obj); |
20 |
$newobj = unserialize($ser); |
22 |
var_dump($newobj->getData()); |
6. Closure
4 |
public static Closure bind ( Closure $closure , object $newthis [, mixed $newscope = 'static' ] ) |
5 |
public Closure bindTo ( object $newthis [, mixed $newscope = 'static'] ) |
这个具体还没研究,具体可以去看官方文档:http://www.php.net/manual/en/reserved.interfaces.php
- PHP Predefined Interfaces 预定义接口
SPL提供了6个迭代器接口: Traversable 遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口) Iterator 迭代器接口(可在内部迭代自己的外部迭代器或类的接口) Ite ...
- PHP预定义接口之 ArrayAccess
最近这段时间回家过年了,博客也没有更新,感觉少学习了好多东西,也错失了好多的学习机会,就像大家在春节抢红包时常说的一句话:一不留神错过了好几亿.废话少说,这篇博客给大家说说关于PHP预定义接口中常用到 ...
- 深入理解PHP数组函数和预定义接口
一. PHP对数组的过滤 函数: array_filter(p1[,p2]) 参数p1是要过滤的数组,参数p2是自定义过滤会掉函数(可以是匿名函数) 例子: <?php $arr = ['',n ...
- 深入理解 PHP 的 7 个预定义接口
深入理解预定义接口 场景:平常工作中写的都是业务模块,很少会去实现这样的接口,但是在框架里面用的倒是很多. 1. Traversable(遍历)接口 该接口不能被类直接实现,如果直接写了一个普通类 ...
- PHP预定义接口
目录 引言 IteratorAggregate(聚合式aggregate迭代器Iterator) Countable ArrayAccess Iterator 总结 引言 在PHP中有好几个预定义的接 ...
- php 预定义接口
Traversable Traversable { } 作用:检测一个类是否可以使用 foreach 进行遍历的接口. php代码中不能用.只有内部的PHP类(用C写的类)才可以直接实现Travers ...
- 预定义接口-迭代器Iterator
<?php /* 可在内部迭代自己的外部迭代器或类的接口. Iterator extends Traversable { abstract public mixed current ( void ...
- Flink Pre-defined Timestamp Extractors / Watermark Emitters(预定义的时间戳提取/水位线发射器)
https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/event_timestamp_extractors.html 根据官网 ...
- oracle有三种类型的异常错误: 预定义 ( Predefined )错误里面的常见错误
oracle有三种类型的异常错误: 预定义 ( Predefined )错误, 非预定义 ( Predefined )错误, 用户定义(User_define) 错误 预定义 ( Predefined ...
随机推荐
- Tomcat环境变量的配置
Tomcat web服务器 支持全部JSP以及Servlet规范 主要作用 是提供了一个可以让Jsp和Servlet运行的平台 tomcat环境变量设置 CATALINA_HOME : D:\bran ...
- CentOS 6.4编译安装淘宝web服务器Tengine
Tengine 是由淘宝核心系统部基于Nginx开发的Web服务器,它在Nginx的基础上,针对大访问量网站的需求,添加了很多功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,淘宝商城 ...
- vim技巧:折叠快捷键
vim技巧:折叠快捷键 以前用的挺熟的,一段时间不用了,快捷键又忘了,不得不重新再看手册,今天专门整理一下,以后查找起来也比较方便. zc 折叠,只折叠最外层的折叠zC 对所在范围内所有嵌套的折叠点进 ...
- 将日志写入EventLog
将日志写入EventLog 面向Windows的编程人员应该不会对Event Log感到陌生,以至于很多人提到日志,首先想到的就是EventLog.EventLog不仅仅记录了Windows系统自身针 ...
- IOS网络编程:HTTP
IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...
- 关于移动手机端富文本编辑器qeditor图片上传改造
日前项目需要在移动端增加富文本编辑,上网找了下,大多数都是针对pc版的,不太兼容手机,当然由于手机屏幕小等原因也限制富文本编辑器的众多强大功能,所以要找的编辑器功能必须是精简的. 找了好久,发现qed ...
- 转:PHP开发框架流行度排名:Laravel居首
原文来自于:http://www.sitepoint.com/best-php-frameworks-2014/ Update: If you’d like to take part in the n ...
- Unity的Profiler性能分析
1. CPU Usage A. WaitForTargetFPS: Vsync(垂直同步)功能所,即显示当前帧的CPU等待时间 B. Overhead: Profiler总体时间-所有单项的记录时间总 ...
- 理解Java(StringBuffer和StringBuilder)
StringBuffer可实现同步,StringBuilder线程不安全. 翻译自Java API英文文档 本质 StringBuffer 和 StringBuilder 均表示一个可变字符序列 这个 ...
- 关于用POI和EXCEL交互的问题
废话不多说,直接通过例子来说明POI的使用: 1.一个创建excel并写入数据的小例子,参照网上的一个例子: public class CreateXL { /** * @param args */ ...