PHP SPL 学习笔记 (一)

技术PHP

SPL 是 PHP 的标准库,定义了一些类和接口,让 PHP 的功能更加丰富。

早就计划对 SPL 进行系统的学习,这里对学习做一些基本的笔记。

先说遍历,能够遍历的类都要实现 Traversable 接口,但是 Traversable 接口不能被单独实现,只能通过实现他的子接口 Iterator 和 IteratorAggregate 来实现 Traversable 接口。因此只要实现了这两个接口中的任何一个,就能让对象用foreach进行遍历。(从 PHP5 开始,任何类如果未实现 Traversable,对类的遍历会转化为对类的公共属性的遍历)。

Iterator 接口

所有实现了 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

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进行遍历了。

创建于2018年01月11日 16:53
阅读量 600
留言列表

暂时没有留言

添加留言