欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

PHP遍歷對象的示例

這篇文章給大家分享的是有關(guān)PHP遍歷對象的示例的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)公司十載專注成都高端網(wǎng)站建設(shè)定制網(wǎng)站服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁設(shè)計,成都網(wǎng)站設(shè)計服務(wù);成都創(chuàng)新互聯(lián)公司服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),重慶小程序開發(fā),軟件開發(fā),網(wǎng)絡(luò)營銷推廣,網(wǎng)絡(luò)運營服務(wù)及企業(yè)形象設(shè)計;成都創(chuàng)新互聯(lián)公司擁有眾多專業(yè)的高端網(wǎng)站制作開發(fā)團隊,資深的高端網(wǎng)頁設(shè)計團隊及經(jīng)驗豐富的架構(gòu)師高端網(wǎng)站策劃團隊;我們始終堅持從客戶的角度出發(fā),為客戶量身訂造網(wǎng)絡(luò)營銷方案,解決網(wǎng)絡(luò)營銷疑問。

對于php來說,foreach是非常方便好用的一個語法,幾乎對于每一個PHPer它都是日常接觸最多的請求之一。那么對象是否能通過foreach來遍歷呢?

答案是肯定的,但是有個條件,那就是對象的遍歷只能獲得它的公共屬性。

// 普通遍歷
class A
{
    public $a1 = '1';
    public $a2 = '2';
    public $a3 = '3';

    private $a4 = '4';
    protected $a5 = '5';

    public $a6 = '6';

    public function test()
    {
        echo 'test';
    }
}
$a = new A();
foreach ($a as $k => $v) {
    echo $k, '===', $v, PHP_EOL;
}

// a1===1
// a2===2
// a3===3
// a6===6

不管是方法還是受保護或者私有的變量,都無法遍歷出來。只有公共的屬性才能被遍歷出來。其實,我們之前在講設(shè)計模式時講過的迭代器模式就是專門用來進行對象遍歷的,而且PHP已經(jīng)為我們準(zhǔn)備好了相關(guān)的接口,我們只需要去實現(xiàn)這個接口就可以完成迭代器模式的創(chuàng)建了。具體的內(nèi)容可以參考之前的設(shè)計模式系列文章:PHP設(shè)計模式之迭代器模式()

// 實現(xiàn)迭代器接口
class B implements Iterator
{
    private $var = [];

    public function __construct($array)
    {
        if (is_array($array)) {
            $this->var = $array;
        }
    }

    public function rewind()
    {
        echo "rewinding\n";
        reset($this->var);
    }

    public function current()
    {
        $var = current($this->var);
        echo "current: $var\n";
        return $var;
    }

    public function key()
    {
        $var = key($this->var);
        echo "key: $var\n";
        return $var;
    }

    public function next()
    {
        $var = next($this->var);
        echo "next: $var\n";
        return $var;
    }

    public function valid()
    {
        $var = $this->current() !== false;
        echo "valid: {$var}\n";
        return $var;
    }
}

$b = new B([1, 2, 3, 4]);

foreach ($b as $k => $v) {
    echo $k, '===', $v, PHP_EOL;
}

// rewinding
// current: 1
// valid: 1
// current: 1
// key: 0
// 0===1
// next: 2
// current: 2
// valid: 1
// current: 2
// key: 1
// 1===2
// next: 3
// current: 3
// valid: 1
// current: 3
// key: 2
// 2===3
// next: 4
// current: 4
// valid: 1
// current: 4
// key: 3
// 3===4
// next:
// current:
// valid:

假如今天的文章只是講之前講過的迭代器模式,那就太沒意思了,所以,咱們還要來學(xué)習(xí)一個更有意思的應(yīng)用。那就是讓對象可以像數(shù)組一樣進行操作。這個其實也是使用PHP早已為我們準(zhǔn)備好的一個接口:ArrayAccess。

// 讓類可以像數(shù)組一樣操作
class C implements ArrayAccess, IteratorAggregate
{
    private $container = [];
    public function __construct()
    {
        $this->container = [
            "one" => 1,
            "two" => 2,
            "three" => 3,
        ];
    }
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }
    public function offsetExists($offset)
    {
        return isset($this->container[$offset]);
    }
    public function offsetUnset($offset)
    {
        unset($this->container[$offset]);
    }
    public function offsetGet($offset)
    {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }

    public function getIterator() {
        return new B($this->container);
    }
}

$c = new C();
var_dump($c);

$c['four'] = 4;
var_dump($c);

$c[] = 5;
$c[] = 6;
var_dump($c);

foreach($c as $k=>$v){
    echo $k, '===', $v, PHP_EOL;
}

// rewinding
// current: 1
// valid: 1
// current: 1
// key: one
// one===1
// next: 2
// current: 2
// valid: 1
// current: 2
// key: two
// two===2
// next: 3
// current: 3
// valid: 1
// current: 3
// key: three
// three===3
// next: 4
// current: 4
// valid: 1
// current: 4
// key: four
// four===4
// next: 5
// current: 5
// valid: 1
// current: 5
// key: 0
// 0===5
// next: 6
// current: 6
// valid: 1
// current: 6
// key: 1
// 1===6
// next: 
// current: 
// valid:

這個接口需要我們實現(xiàn)四個方法:

  • offsetSet($offset, $value),根據(jù)偏移量設(shè)置值

  • offsetExists($offset),根據(jù)偏移量確定是否存在內(nèi)容

  • offsetUnset($offset),根據(jù)偏移量刪除內(nèi)容

  • offsetGet($offset),根據(jù)依稀量獲取內(nèi)容

這里的偏移量就是我們常說的下標(biāo)。通過實現(xiàn)這四個方法,我們就可以像操作數(shù)組一樣的操作對象。當(dāng)然,日常開發(fā)中我們可能并不會很經(jīng)常的使用包括迭代器在內(nèi)的這些對象遍歷的能力。通常我們會直接去將對象轉(zhuǎn)換成數(shù)組 (array) obj 來進行下一步的操作。不過,在java中,特別是JavaBean中會經(jīng)常在類的內(nèi)部有一個 List<T> 為自己的對象來表示自身的集合狀態(tài)。通過對比,我們發(fā)現(xiàn)PHP也完全可以實現(xiàn)這樣的能力,而且使用迭代器和 ArrayAccess 接口還能夠更方便的實現(xiàn)類似的能力。這是非常有用的一種知識擴展,或許下一個項目中你就能運用上這些能力哦!

測試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E6%80%8E%E4%B9%88%E9%81%8D%E5%8E%86%E5%AF%B9%E8%B1%A1%EF%BC%9F.ph

感謝各位的閱讀!關(guān)于“PHP遍歷對象的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網(wǎng)站名稱:PHP遍歷對象的示例
網(wǎng)站鏈接:http://aaarwkj.com/article44/igophe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設(shè)、用戶體驗、全網(wǎng)營銷推廣、建站公司搜索引擎優(yōu)化、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
久久综合午夜福利视频| 欧美性色黄大片人与善| av天堂在线观看网站| 亚洲av优选在线观看精品| 亚洲av成人一区二区三区| 九九热九九热九九热九| 中国亚洲黄色录像免费看| 久久这里只有精品视频| 国产精品盗摄一区二区三区| 一区二区三区日韩激情| 亚洲欧美高清一区二区| 欧美成人精品午夜一区二区| 欧美日韩亚洲综合国产人| 怡红院怡春院视频免费看| 国产精品一久久香蕉产线看| 精品国产美女诱惑久久久| 亚洲国产精品一区二区成人| 亚洲国产成人精品福利| 91精品国产在线观看| 日本韩国国语对白一区二区三区| 日韩亚洲av在线免费观看| 亚洲综合欧美日韩一区| 偷拍一区二区三区免费| 国产精品国产三级区别| 97精品少妇一区二区三区| 国产原创av剧情在线播放| 精品国产无遮挡污污网站| 午夜夫妻生活视频在线观看 | 亚洲国产欧美日韩综合| 91麻豆精品国产综合久久久| 美味人妻手机在线观看| 人妻的秘密一区二区三区| 天天操天天日天天干夜夜情欢| 亚洲精品国产av一区二区三区 | 亚洲精品91在线中文字幕| 黄色大片黄色大片黄色大片| 午夜夫妻生活视频在线观看| 午夜av在线毛片免费观看| 厕所偷拍视频一区二区三区| 国产精品日韩欧美一区二区| 夜夜操狠狠操天天摸|