摘要:中在基礎(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:20Iterator接口
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)操作獲取元數(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...
摘要:總結(jié)本文主要學(xué)習(xí)了啟動時做的七步準(zhǔn)備工作環(huán)境檢測配置加載日志配置異常處理注冊注冊啟動。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動Bootstrap工作,本文主要學(xué)習(xí)相關(guān)源碼,看看Laravel啟動程序做了哪些具體工作,并將個人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...
摘要:學(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...
摘要:實(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...
閱讀 1844·2021-09-14 18:03
閱讀 2277·2019-08-30 15:48
閱讀 1133·2019-08-30 14:09
閱讀 518·2019-08-30 12:55
閱讀 2739·2019-08-29 11:29
閱讀 1497·2019-08-26 13:43
閱讀 2320·2019-08-26 13:30
閱讀 2379·2019-08-26 12:17