7.12 遍历对象

通过 foreach 可以得到对象所有公开的属性,在类的内部还能获取到私有的和受保护的属性。

通过实现 Iterator 接口,可以使得对象在被 foreach 循环时处理一些事情。

// 定义类
class Example implements Iterator{
    // 内部属性
    private $property = [];
    // 构造函数
    public function __construct(array $data){
        $this->property = $data;
    }

    // 初始化:重置指针,将指针移动到第一位,仅在foreach初始化时运行一次
    public function rewind(){
        echo "0.rewind 

"; reset($this->property); } // 第一步:验证当前指针指向的元素是否存在 public function valid(){ echo "1.valid
"; return current($this->property); } // 第二步:获取当前指针指向的元素 public function current(){ echo "2.current
"; $idx = current($this->property); echo "   $idx
"; return $idx; } // 第三步:获取当前指针指向的索引 public function key(){ echo "3.key
"; $key = key($this->property); echo "   $key
"; return $key; } // 第四步:在foreach里循环 // 第五步:指针往下移动一步 public function next(){ echo "5.next

"; return next($this->property); } } // 实例化 $exam = new Example(['a' => 'php', 'b' => 'asp', 'c' => 'jsp']); // 循环遍历这个对象 foreach ($exam as $key => $value) { echo "4.[$key : $value]
"; }

还一种方法,只需要返回一个 Iterator 类的实例即可。

// 定义类
class Example implements IteratorAggregate{
    // 私有属性
    private $array = [];
    // 构造函数
    public function __construct(array $array = []){
        $this->array = $array;
    }
    // 接口方法实现
    public function getIterator(){
        // 返回一个Iterator类的实例,此处用匿名类实现
        return new class($this->array) implements Iterator{
            private $data;
            public function __construct(array $data){
                $this->data = $data;
            }
            public function rewind(){
                reset($this->data);
            }
            public function valid(){
                return current($this->data) !== false;
            }
            public function current(){
                return current($this->data);
            }
            public function key(){
                return key($this->data);
            }
            public function next(){
                return next($this->data);
            }
        };
    }
}

// 实例化
$exam = new Example(['a' => 'php', 'b' => 'asp', 'c' => 'jsp']);
// 循环遍历这个对象
foreach ($exam as $key => $value) {
    echo "$key : $value 
"; }

你可能感兴趣的:(7.12 遍历对象)