摘要:中在基礎集合類路由類中和分頁類中等,都用到了對象遍歷這個小知識點,這些類都是實現了這個接口,這個接口定義,返回的是迭代器對象。標準擴展庫中提供了很多默認迭代器實現類,比較常用的是數組迭代器對象,參考官網迭代器。
說明:本文章主要講述PHP的對象遍歷(Iterator)知識點。由于Laravel框架中就在集合(Collection)中用到了對象遍歷知識點,故記錄并學習之。同時,作者會將開發過程中的一些截圖和代碼黏上去,提高閱讀效率。
Laravel中在基礎集合類IlluminateSupportCollection、路由類中IlluminateRoutingRouteCollection和分頁類中IlluminatePaginationPaginator等,都用到了對象遍歷這個小知識點,這些類都是實現了IteratorAggregate這個接口,這個接口定義getIterator(),返回的是迭代器對象。PHP標準擴展庫中提供了很多默認迭代器實現類,比較常用的是數組迭代器對象ArrayIterator,參考官網:迭代器。
對象遍歷(Iterator) 基本遍歷PHP5提供了遍歷對象屬性的方法,而且默認是可見屬性,如代碼中foreach遍歷對象屬性,默認的都是可見屬性:
$value) { echo $key.":".$value.PHP_EOL; }
輸出的是:
name:PHP address:php.net
如果需要遍歷對象的不可見屬性,則在對象內部定義一個遍歷方法:
public function unAccessIterator() { echo "Iterator the unaccess fields:".PHP_EOL; foreach ($this as $key => $value) { echo $key.":".$value.PHP_EOL; } }
對象外部訪問:
$testIterator->unAccessIterator();
將可以遍歷對象的不可見屬性,輸出結果:
Iterator the unaccess fields: name:PHP address:php.net sex:man age:20Iterator接口
PHP提供了Iterator接口,用來定義迭代器對象來自定義遍歷,所以利用Iterator接口來構造迭代器,需要實現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是不可見的,通過實現Iterator接口,同樣可以遍歷自定義的可不見屬性,輸出結果如下:
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真心為程序員考慮了很多,實現IteratorAggragate接口后只需實現getIterator()方法直接返回迭代器對象,就不需要實現Iterator接口需要的一些方法來創建一些迭代器對象,因為PHP已經提供了很多迭代器對象如ArrayIterator對象。所以再重構下上面代碼:
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,輸出結果:
0:symfony/http-foundation 1:symfony/http-kernel 2:guzzle/guzzle 3:monolog/monolog
文章開頭聊到Laravel中就用到了IteratorAggragate這個接口,可以看看文件的源碼。
總結:PHP提供的對象遍歷特性功能還是很有用處的,下一篇準備看下generator生成器知識點,generator提供了另外一種方式定義Iterator。多多使用Laravel,研究Laravel源碼并模仿之,也不錯哦。
歡迎關注Laravel-China。
RightCapital招聘Laravel DevOps
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/21787.html
摘要:使用了來表示該,該接口也是對的抽象,暴露了一些常用方法判斷是否滿足要求的方法的讀寫相關操作獲取元數據方法操作指針相關方法等等。本篇主要學習下相關使用。后續還會分享相關使用,到時見。 說明:本文主要學習guzzlehttp/guzzle package的使用,該package提供了一套發送HTTP請求API,就像phpunit package, mockery package, symf...
摘要:總結本文主要學習了啟動時做的七步準備工作環境檢測配置加載日志配置異常處理注冊注冊啟動。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動Bootstrap工作,本文主要學習相關源碼,看看Laravel啟動程序做了哪些具體工作,并將個人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...
摘要:學習筆記之已經聊過使用了來設計,看源碼發現其巧妙用了和的一些數組函數來設計。開發環境內置函數和看源碼之前,先看下這幾個內置函數的使用。學習筆記之實例化源碼解析已經聊過的實例化,得到中的變量,即的實例化對象。后面再學習下的源碼,到時見。 說明:本文主要學習Laravel的Middleware的源碼設計思想,并將學習心得分享出來,希望對別人有所幫助。Laravel學習筆記之Decorato...
摘要:實際上,在中關閉主要包括兩個過程保存當前到介質中在中存入。,學習下關閉的源碼吧先??傊P閉的第二件事就是給添加。通過對的源碼分析可看出共分為三大步啟動操作關閉。總結本小系列主要學習了的源碼,學習了的三大步。 說明:在中篇中學習了session的CRUD增刪改查操作,本篇主要學習關閉session的相關源碼。實際上,在Laravel5.3中關閉session主要包括兩個過程:保存當前U...
閱讀 1839·2021-09-14 18:03
閱讀 2274·2019-08-30 15:48
閱讀 1129·2019-08-30 14:09
閱讀 515·2019-08-30 12:55
閱讀 2735·2019-08-29 11:29
閱讀 1494·2019-08-26 13:43
閱讀 2318·2019-08-26 13:30
閱讀 2376·2019-08-26 12:17