SPL 是 PHP 的标准库,定义了一些类和接口,让 PHP 的功能更加丰富。
早就计划对 SPL 进行系统的学习,这里对学习做一些基本的笔记。
先说遍历,能够遍历的类都要实现 Traversable 接口,但是 Traversable 接口不能被单独实现,只能通过实现他的子接口 Iterator 和 IteratorAggregate 来实现 Traversable 接口。因此只要实现了这两个接口中的任何一个,就能让对象用foreach进行遍历。(从 PHP5 开始,任何类如果未实现 Traversable,对类的遍历会转化为对类的公共属性的遍历)。
所有实现了 Iterator 接口的类,都可以进行遍历。实现 Iterator 接口需要实现 5 个方法。
interface Iterator extends Traversable {
//返回迭代器当前元素
public function current();
//移动迭代器位置到下一个
public function next();
//返回返回迭代器当前元素的键名
public function key();
//检查迭代器当前位置是否有效
public function valid();
//恢复迭代器的初始位置
public function rewind();
}
举个栗子
class MenIterator implements Iterator
{
public $men = [];
public $position = 0;
public function current()
{
return $this->men[$this->position];
}
public function next()
{
$this->position++;
}
public function rewind()
{
$this->position = 0;
}
public function valid()
{
return isset($this->men[$this->position]);
}
public function key()
{
return $this->position;
}
}
通过此接口可以灵活地对任何对象实现遍历操作。
IteratorAggregate 接口和 Iterator 一样,实现了 IteratorAggregte 接口的类也可以进行遍历。Iterator 隐性的通过 getIterator 方法返回一个迭代器,本质上仍然相当于实现了 Iterator 接口。使用这种方式符合“多用组合,少用继承”的面向对象设计思想。
interface IteratorAggregate extends Traversable {
public function getIterator();
}
getIterator 方法必须返回一个 Iterator 实例。
class Men {
public function __construct(){
//MenIterator见上例
$this->men = new MenIterator;
$this->men->men = ["a", "b"];
}
public function getIterator(){
return $this->men;
}
}
这样,Men 类的实例便可以使用 foreach进行遍历了。
暂时没有留言