7.12 遍歷對(duì)象

通過(guò) foreach 可以得到對(duì)象所有公開的屬性,在類的內(nèi)部還能獲取到私有的和受保護(hù)的屬性。

通過(guò)實(shí)現(xiàn) Iterator 接口,可以使得對(duì)象在被 foreach 循環(huán)時(shí)處理一些事情。

// 定義類
class Example implements Iterator{
    // 內(nèi)部屬性
    private $property = [];
    // 構(gòu)造函數(shù)
    public function __construct(array $data){
        $this->property = $data;
    }

    // 初始化:重置指針,將指針移動(dòng)到第一位,僅在foreach初始化時(shí)運(yùn)行一次
    public function rewind(){
        echo "0.rewind <br /><hr />";
        reset($this->property);
    }

    // 第一步:驗(yàn)證當(dāng)前指針指向的元素是否存在
    public function valid(){
        echo "1.valid <br />";
        return current($this->property);
    }
    // 第二步:獲取當(dāng)前指針指向的元素
    public function current(){
        echo "2.current <br />";
        $idx = current($this->property);
        echo "&nbsp;&nbsp; $idx <br />";
        return $idx;
    }
    // 第三步:獲取當(dāng)前指針指向的索引
    public function key(){
        echo "3.key <br />";
        $key = key($this->property);
        echo "&nbsp;&nbsp; $key <br />";
        return $key;
    }
    

    // 第四步:在foreach里循環(huán)


    // 第五步:指針往下移動(dòng)一步
    public function next(){
        echo "5.next <br /> <hr />";
        return next($this->property);
    }
}

// 實(shí)例化
$exam = new Example(['a' => 'php', 'b' => 'asp', 'c' => 'jsp']);
// 循環(huán)遍歷這個(gè)對(duì)象
foreach ($exam as $key => $value) {
    echo "4.[$key : $value] <br />";
}

還一種方法,只需要返回一個(gè) Iterator 類的實(shí)例即可。

// 定義類
class Example implements IteratorAggregate{
    // 私有屬性
    private $array = [];
    // 構(gòu)造函數(shù)
    public function __construct(array $array = []){
        $this->array = $array;
    }
    // 接口方法實(shí)現(xiàn)
    public function getIterator(){
        // 返回一個(gè)Iterator類的實(shí)例,此處用匿名類實(shí)現(xiàn)
        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);
            }
        };
    }
}

// 實(shí)例化
$exam = new Example(['a' => 'php', 'b' => 'asp', 'c' => 'jsp']);
// 循環(huán)遍歷這個(gè)對(duì)象
foreach ($exam as $key => $value) {
    echo "$key : $value <br />";
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容