PHP Traversable 接口
1. Traversable接口介绍
1.1 Traversable接口的定义
Traversable 接口是所有能够使用 foreach 进行遍历的类的基类。
Traversable 是一个伪接口,并不包含任何的方法,其存在的意义在于作为一种标识接口,用于检测 class 或对象是否可遍历。
1.2 Traversable接口的位置
Traversable 接口位于 SPL(Standard PHP Library) 中。SPL 是 PHP 官方提供的一个标准库,包含了一些常用的数据结构和算法。
2. 实现 Traversable
2.1 实现 Traversable 的类
要使一个类可遍历,必须实现 Traversable 接口。以下是一个例子:
class MyCollection implements Traversable
{
private $items = [];
public function __construct($items)
{
$this->items = $items;
}
public function getItems()
{
return $this->items;
}
public function __iterable()
{
return $this->getItems();
}
}
上面这个类实现了 Traversable 接口。其中 `__iterable()` 方法是 PHP 7.1 之后新增的魔术方法,它返回一个数组,这个数组就是可遍历的对象。如果不定义 `__iterable()` 方法,则默认遍历对象的 public 属性。
2.2 实现 IteratorAggregate 接口
如果一个类要实现 foreach 遍历,还可以实现 IteratorAggregate 接口,从而实现 Iterator 接口中定义的方法。以下是一个例子:
class MyCollection implements IteratorAggregate
{
private $items = [];
public function __construct($items)
{
$this->items = $items;
}
public function getIterator()
{
return new ArrayIterator($this->items);
}
}
上面这个类实现了 IteratorAggregate 接口。其中 `getIterator()` 方法返回了一个 ArrayIterator 对象,这个对象实现了 Iterator 接口。
3. 使用 Traversable
3.1 遍历对象
我们已经知道了如何实现 Traversable 接口,现在就可以来遍历一个可遍历的对象了。遍历一个可遍历的对象非常简单,只需要用 foreach 循环即可。以下是一个例子:
$collection = new MyCollection(['foo', 'bar', 'baz']);
foreach($collection as $item)
{
echo "$item\n";
}
上面这个例子创建了一个 MyCollection 对象,并且将它遍历了一遍。遍历的结果是输出了三个元素:foo、bar 和 baz。
3.2 遍历数组
遍历数组是非常常见的操作。PHP 数组是可以直接遍历的,不需要实现 Traversable 接口。以下是一个例子:
$fruits = ['apple', 'banana', 'cherry'];
foreach($fruits as $fruit)
{
echo "$fruit\n";
}
上面这个例子创建了一个数组,然后用 foreach 遍历输出了数组的元素。
4. 总结
Traversable 接口是 PHP 中用于检测类或对象是否可遍历的接口。一个类要实现 Traversable 接口,可以直接在类中实现 `__iterable()` 方法或者实现 IteratorAggregate 接口。遍历一个可遍历的对象非常简单,只需要用 foreach 循环即可。