成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel學(xué)習(xí)筆記之PHP對象遍歷(Iterator)

余學(xué)文 / 2590人閱讀

摘要:中在基礎(chǔ)集合類路由類中和分頁類中等,都用到了對象遍歷這個小知識點(diǎn),這些類都是實(shí)現(xiàn)了這個接口,這個接口定義,返回的是迭代器對象。標(biāo)準(zhǔn)擴(kuò)展庫中提供了很多默認(rèn)迭代器實(shí)現(xiàn)類,比較常用的是數(shù)組迭代器對象,參考官網(wǎng)迭代器。

說明:本文章主要講述PHP的對象遍歷(Iterator)知識點(diǎn)。由于Laravel框架中就在集合(Collection)中用到了對象遍歷知識點(diǎn),故記錄并學(xué)習(xí)之。同時,作者會將開發(fā)過程中的一些截圖和代碼黏上去,提高閱讀效率。

Laravel中在基礎(chǔ)集合類IlluminateSupportCollection、路由類中IlluminateRoutingRouteCollection和分頁類中IlluminatePaginationPaginator等,都用到了對象遍歷這個小知識點(diǎn),這些類都是實(shí)現(xiàn)了IteratorAggregate這個接口,這個接口定義getIterator(),返回的是迭代器對象。PHP標(biāo)準(zhǔn)擴(kuò)展庫中提供了很多默認(rèn)迭代器實(shí)現(xiàn)類,比較常用的是數(shù)組迭代器對象ArrayIterator,參考官網(wǎng):迭代器。

對象遍歷(Iterator) 基本遍歷

PHP5提供了遍歷對象屬性的方法,而且默認(rèn)是可見屬性,如代碼中foreach遍歷對象屬性,默認(rèn)的都是可見屬性:

 $value) {
    echo $key.":".$value.PHP_EOL;
}

輸出的是:

name:PHP
address:php.net

如果需要遍歷對象的不可見屬性,則在對象內(nèi)部定義一個遍歷方法:

public function unAccessIterator()
    {
        echo "Iterator the unaccess fields:".PHP_EOL;
        foreach ($this as $key => $value) {
            echo $key.":".$value.PHP_EOL;
        }
    }

對象外部訪問:

$testIterator->unAccessIterator();

將可以遍歷對象的不可見屬性,輸出結(jié)果:

Iterator the unaccess fields:
name:PHP
address:php.net
sex:man
age:20
Iterator接口

PHP提供了Iterator接口,用來定義迭代器對象來自定義遍歷,所以利用Iterator接口來構(gòu)造迭代器,需要實(shí)現(xiàn)Iterator定義的幾個方法:

composerPackage = $composerPackage;
    }

    public function unAccessIterator()
    {
        echo "Iterator the unaccess fields:".PHP_EOL;
        foreach ($this as $key => $value) {
            echo $key.":".$value.PHP_EOL;
        }
    }

    /**
     * Return the current element
     * @link http://php.net/manual/en/iterator.current.php
     * @return mixed Can return any type.
     * @since 5.0.0
     */
    public function current()
    {
        // TODO: Implement current() method.
        echo "Return the current element:".PHP_EOL;
        return current($this->composerPackage);
    }

    /**
     * Move forward to next element
     * @link http://php.net/manual/en/iterator.next.php
     * @return void Any returned value is ignored.
     * @since 5.0.0
     */
    public function next()
    {
        // TODO: Implement next() method.
        echo "Move forward to next element:".PHP_EOL;
        return next($this->composerPackage);
    }

    /**
     * Return the key of the current element
     * @link http://php.net/manual/en/iterator.key.php
     * @return mixed scalar on success, or null on failure.
     * @since 5.0.0
     */
    public function key()
    {
        // TODO: Implement key() method.
        echo "Return the key of the current element:".PHP_EOL;
        return key($this->composerPackage);
    }

    /**
     * Checks if current position is valid
     * @link http://php.net/manual/en/iterator.valid.php
     * @return boolean The return value will be casted to boolean and then evaluated.
     * Returns true on success or false on failure.
     * @since 5.0.0
     */
    public function valid()
    {
        // TODO: Implement valid() method.
        echo "Checks if current position is valid:".PHP_EOL;
        return current($this->composerPackage) !== false;
    }

    /**
     * Rewind the Iterator to the first element
     * @link http://php.net/manual/en/iterator.rewind.php
     * @return void Any returned value is ignored.
     * @since 5.0.0
     */
    public function rewind()
    {
        // TODO: Implement rewind() method.
        echo "Rewind the Iterator to the first element:".PHP_EOL;
        reset($this->composerPackage);
    }
}

/*
$testIterator = new TestIterator();
foreach ($testIterator as $key => $value) {
    echo $key.":".$value.PHP_EOL;
}
$testIterator->unAccessIterator();*/

$testIterator = new TestIterator([
    "symfony/http-foundation",
    "symfony/http-kernel",
    "guzzle/guzzle",
    "monolog/monolog"
]);
foreach ($testIterator as $key => $value) {
    echo $key.":".$value.PHP_EOL;
}

成員變量$composerPackage是不可見的,通過實(shí)現(xiàn)Iterator接口,同樣可以遍歷自定義的可不見屬性,輸出結(jié)果如下:

Rewind the Iterator to the first element:
Checks if current position is valid:
Return the current element:
Return the key of the current element:
0:symfony/http-foundation
Move forward to next element:
Checks if current position is valid:
Return the current element:
Return the key of the current element:
1:symfony/http-kernel
Move forward to next element:
Checks if current position is valid:
Return the current element:
Return the key of the current element:
2:guzzle/guzzle
Move forward to next element:
Checks if current position is valid:
Return the current element:
Return the key of the current element:
3:monolog/monolog
Move forward to next element:
Checks if current position is valid:
IteratorAggregate接口

PHP真心為程序員考慮了很多,實(shí)現(xiàn)IteratorAggragate接口后只需實(shí)現(xiàn)getIterator()方法直接返回迭代器對象,就不需要實(shí)現(xiàn)Iterator接口需要的一些方法來創(chuàng)建一些迭代器對象,因?yàn)镻HP已經(jīng)提供了很多迭代器對象如ArrayIterator對象。所以再重構(gòu)下上面代碼:

class TestCollection implements IteratorAggregate{
    ...
    /**
     * @var array
     */
    private $composerPackage;
    
    ...
    
    /**
     * Retrieve an external iterator
     * @link http://php.net/manual/en/iteratoraggregate.getiterator.php
     * @return Traversable An instance of an object implementing Iterator or
     * Traversable
     * @since 5.0.0
     */
    public function getIterator()
    {
        // TODO: Implement getIterator() method.
        return new ArrayIterator($this->composerPackage);
    }
   
}

$testCollection = new TestCollection([
    "symfony/http-foundation",
    "symfony/http-kernel",
    "guzzle/guzzle",
    "monolog/monolog"
]);
foreach ($testCollection as $key => $value) {
    echo $key.":".$value.PHP_EOL;
}

同樣的,能遍歷$testCollection對象的不可見屬性$composerPackage,輸出結(jié)果:

0:symfony/http-foundation
1:symfony/http-kernel
2:guzzle/guzzle
3:monolog/monolog

文章開頭聊到Laravel中就用到了IteratorAggragate這個接口,可以看看文件的源碼。

總結(jié):PHP提供的對象遍歷特性功能還是很有用處的,下一篇準(zhǔn)備看下generator生成器知識點(diǎn),generator提供了另外一種方式定義Iterator。多多使用Laravel,研究Laravel源碼并模仿之,也不錯哦。

歡迎關(guān)注Laravel-China。
RightCapital招聘Laravel DevOps

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21787.html

相關(guān)文章

  • Laravel學(xué)習(xí)筆記Core Concepts in Guzzle Package——Strea

    摘要:使用了來表示該,該接口也是對的抽象,暴露了一些常用方法判斷是否滿足要求的方法的讀寫相關(guān)操作獲取元數(shù)據(jù)方法操作指針相關(guān)方法等等。本篇主要學(xué)習(xí)下相關(guān)使用。后續(xù)還會分享相關(guān)使用,到時見。 說明:本文主要學(xué)習(xí)guzzlehttp/guzzle package的使用,該package提供了一套發(fā)送HTTP請求API,就像phpunit package, mockery package, symf...

    singerye 評論0 收藏0
  • Laravel學(xué)習(xí)筆記bootstrap源碼解析

    摘要:總結(jié)本文主要學(xué)習(xí)了啟動時做的七步準(zhǔn)備工作環(huán)境檢測配置加載日志配置異常處理注冊注冊啟動。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動Bootstrap工作,本文主要學(xué)習(xí)相關(guān)源碼,看看Laravel啟動程序做了哪些具體工作,并將個人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...

    xiaoxiaozi 評論0 收藏0
  • PHP的生成器

    摘要:它最簡單的調(diào)用形式看起來像一個申明,不同之處在于普通會返回值并終止函數(shù)的執(zhí)行,而會返回一個值給循環(huán)調(diào)用此生成器的代碼并且只是暫停執(zhí)行生成器函數(shù)。 0x01 寫在前面 本文主要介紹: Generator的簡單用法。 Generator的底層實(shí)現(xiàn)。 本文比較長,可能會耗費(fèi)你比較多的時間。如果你比較了解Generator的用法,僅想了解底層實(shí)現(xiàn),可以直接跳到底層實(shí)現(xiàn)部分。 本文分析的PH...

    LMou 評論0 收藏0
  • Laravel學(xué)習(xí)筆記Middleware源碼解析

    摘要:學(xué)習(xí)筆記之已經(jīng)聊過使用了來設(shè)計(jì),看源碼發(fā)現(xiàn)其巧妙用了和的一些數(shù)組函數(shù)來設(shè)計(jì)。開發(fā)環(huán)境內(nèi)置函數(shù)和看源碼之前,先看下這幾個內(nèi)置函數(shù)的使用。學(xué)習(xí)筆記之實(shí)例化源碼解析已經(jīng)聊過的實(shí)例化,得到中的變量,即的實(shí)例化對象。后面再學(xué)習(xí)下的源碼,到時見。 說明:本文主要學(xué)習(xí)Laravel的Middleware的源碼設(shè)計(jì)思想,并將學(xué)習(xí)心得分享出來,希望對別人有所幫助。Laravel學(xué)習(xí)筆記之Decorato...

    _Dreams 評論0 收藏0
  • Laravel學(xué)習(xí)筆記Session源碼解析(下)

    摘要:實(shí)際上,在中關(guān)閉主要包括兩個過程保存當(dāng)前到介質(zhì)中在中存入。,學(xué)習(xí)下關(guān)閉的源碼吧先。總之,關(guān)閉的第二件事就是給添加。通過對的源碼分析可看出共分為三大步啟動操作關(guān)閉。總結(jié)本小系列主要學(xué)習(xí)了的源碼,學(xué)習(xí)了的三大步。 說明:在中篇中學(xué)習(xí)了session的CRUD增刪改查操作,本篇主要學(xué)習(xí)關(guān)閉session的相關(guān)源碼。實(shí)際上,在Laravel5.3中關(guān)閉session主要包括兩個過程:保存當(dāng)前U...

    Awbeci 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<