《PHP設(shè)計模式介紹》第八章 迭代器模式
創(chuàng)新互聯(lián)公司堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的廣漢網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
類中的面向?qū)ο缶幊谭庋b應(yīng)用邏輯 類 就是實例化的對象 每個單獨的對象都有一個特定的身份和狀態(tài) 單獨的對象是一種組織代碼的有用方法 但通常你會處理一組對象或者集合
屬性來自 SQL 查詢的一組數(shù)據(jù)就是一個集合 就像本書前面章節(jié)介紹的 Monopoly 游戲示例的對象列表
集合不一定是均一的 圖形用戶界面框架中的 Window 對象可以收集任意數(shù)量的控制對象 - Menu Slider 和 Button 并且 集合的實現(xiàn)可以有多種方式 PHP 數(shù)字是一個集合 但也是一個散列表 一個鏈接列表 一個堆棧以及隊列
問題
如何操縱任意的對象集合?
解決方案
使用迭代器模式來提供對集合內(nèi)容的統(tǒng)一存取
你可能沒有意識到這一點 但你每天都在使用迭代器模式 - 它潛藏在 PHP 的數(shù)組類型和各種數(shù)組操作函數(shù)中 (其實 給你一些固有類的數(shù)組的組合和一群用這些固有類工作的可變函數(shù) 你將不得不使用這些數(shù)組來處理對象集合 這是在 PHP 中的本地數(shù)組迭代
$test? =? array( one ? o ? three );$output? =? ; reset($test); do? {$output? =? current($test);}? while? (next($test));echo? $output;? //? produces? oneothree
reset() 函數(shù)將迭代重新轉(zhuǎn)到數(shù)組的開始 current() 返回當(dāng)前元素的值 next() 則前進(jìn)至數(shù)組中的下一個元素并返回新的 current() 值 當(dāng)你超出數(shù)組的最后一個元素時 next() 返回 false 使用這些迭代方法 PHP 數(shù)組的內(nèi)部實現(xiàn)就與你不相關(guān)了 迭代器結(jié)合了封裝和多態(tài)的面向?qū)ο蟪绦蛟O(shè)計原理 使用迭代器 你可以對集合中的對象進(jìn)行操作 而無需專門了解集合如何顯現(xiàn)或者集合包含什么(對象的種類) 迭代器提供了不同固定迭代實現(xiàn)的統(tǒng)一接口 它完全包含了如何操縱特定集合的詳細(xì)信息 包括顯示哪些項(過濾)及其顯示順序(排序)
讓我們創(chuàng)建一個簡單的對象 在數(shù)組中對它進(jìn)行操作 (盡管該示例在 PHP 環(huán)境下 但迭代器并不特定于 PHP 雖然添加了較多的引用操作符 本章節(jié)中的大多數(shù)示例在 PHP 下也能夠運行) 對象 Lendable 表示諸如電影 相冊等媒體 它作為 Web 站點的一部分或服務(wù) 允許用戶瀏覽或?qū)⑺麄兊拿襟w集合分享給其他用戶 (對??????? 于該示例 請無需考慮其他方面 )讓我們開始下面對 Lendable 基礎(chǔ)設(shè)計的測試
//? PHP class? LendableTestCase? extends? UnitTestCase? {function? TestCheckout()? {$item? =? new? Lendable;$this assertFalse($item borrower);$item checkout( John );$this assertEqual( borrowed ? $item status);$this assertEqual( John ? $item borrower);}function? TestCheckin()? {$item? =? new? Lendable;$item checkout( John );$item checkin();$this assertEqual( library ? $item status);$this assertFalse($item borrower);}}
要實現(xiàn)這一最初測試的需求 我們來創(chuàng)建一個帶有若干公共屬性和一些方法的類 來觸發(fā)這些屬性的值
class? Lendable? {public? $status? =? library ;public? $borrower? =? ;public? function? checkout($borrower)? {$this status? =? borrowed ;$this borrower? =? $borrower;}public? function? checkin()? {$this status? =? library ;$this borrower? =? ;}}
Lendable 是一個好的 普通的開端 讓我們將它擴(kuò)展到諸如 DVD 或 CD 的磁道項 媒體擴(kuò)展了 Lendable 并且磁道詳細(xì)記錄了特定媒體的詳細(xì)信息 包括項目的名稱 發(fā)布的年份以及項本身的類型
class? Media? extends? Lendable? {public? $name; public? $type; public? $year;public? function? __construct($name ? $year ? $type= dvd )? {$this name? =? $name;$this type? =? $type;$this year? =? (int)$year;}}
要使事情更加簡單 媒體有三個公共的實例變量 Media::name Media::year 和Media::type 構(gòu)造函數(shù)采用了兩個參數(shù) 將第一個存儲在 $name 中 第二個存儲在 $year 中 構(gòu)造函數(shù)還允許可選的第三個參數(shù)來指定類型(缺省為dvd)
給定單獨的對象來操作 你現(xiàn)在可以創(chuàng)建一個容器來包含他們 Library 類似于常用的庫 Library 應(yīng)該能夠添加 刪除和計算集合中的項 甚至 Library 還應(yīng)該允許訪問集合(本章中的樣本代碼部分可看到示例)中的單一的項(對象)
我們開始構(gòu)建 Library 的測試用例
class? LibraryTestCase? extends? UnitTestCase? {function? TestCount()? {$lib? =? new? Library;$this assertEqual( ? $lib count());}}
它是滿足這一測試的簡單類
class? Library? {function? count()? {return? ;}}
繼續(xù)將一些有趣的功能添加到測試中
class? LibraryTestCase? extends? UnitTestCase? {function? TestCount()? {? /*? ? */? }function? TestAdd()? {$lib? =? new? Library;$lib add( one );$this assertEqual( ? $lib count());}}
實現(xiàn) add() 的簡單方法是建立在 PHP 靈活數(shù)組函數(shù)的基礎(chǔ)上 你可以將項添加到實例變量并使用 count() 來返回集合眾項的數(shù)量
class? Library? {protected? $collection? =? array();function? count()? {return? count($this collection);}function? add($item)? {$this collection[]? =? $item;}}
lishixinzhi/Article/program/net/201311/13092
簡介: 迭代器(iterator)有時又稱游標(biāo)(cursor)是程序設(shè)計的軟件設(shè)計模式,可在容器(container,例如鏈表或陣列)上遍訪的接口,設(shè)計人員無需關(guān)心容器的內(nèi)容。
1.功能: 迭代器使開發(fā)人員能夠在類或結(jié)構(gòu)中支持foreach迭代,而不必整個實現(xiàn)IEnumerable或者IEnumerator接口。只需提供一個迭代器,即可遍歷類中的數(shù)據(jù)結(jié)構(gòu)。當(dāng)編譯器檢測到迭代器時,將自動生成IEnumerable接口或者IEnumerator接口的Current,MoveNext和Dispose方法。
2.特點: (1)迭代器是可以返回相同類型值的有序序列的一段代碼。 (2)迭代器可用作方法、運算符或get訪問器的代碼體。 (3)迭代器代碼使用yieldreturn語句依次返回每個元素,yield break將終止迭代。 (4)可以在類中實現(xiàn)多個迭代器,每個迭代器都必須像任何類成員一樣有惟一的名稱,并且可以在foreach語句中被客戶端,代碼調(diào)用如下所示:foreach(int x in SimpleClass.Iterator2){}。 (5)迭代器的返回類型必須為IEnumerable和IEnumerator中的任意一種。
搜索
java五大數(shù)據(jù)結(jié)構(gòu)
python必背100源代碼
編程入門教程300例
經(jīng)典編程100例
python全套學(xué)習(xí)資料
遞歸查詢和迭代查詢
迭代器是一種更高級的工具。foreach是簡單的循環(huán)語法。雖然功能上看起來相似。但迭代器是工具,這是二者性質(zhì)上的不同,所以迭代器有更豐富的功能特性,還可以自定義具體的實現(xiàn)。特別是在內(nèi)存占用上,迭代器是按需讀取數(shù)據(jù),foreach是一次性載入數(shù)據(jù)。PHP里面PDO,SimpleXML里面都有迭代器的具體實現(xiàn),更完整的全部在SPL擴(kuò)展部分。
使用foreach 與使用迭代器,并不沖突?
迭代器可以使用在:
1、使用返回迭代器的包或庫時(如PHP5中的SPL迭代器)
2、無法在一次的調(diào)用獲取容器的所有元素時
3、要處理數(shù)量巨大的無素時(數(shù)據(jù)庫中的表以GB計的數(shù)據(jù))
迭代器還可以用來構(gòu)造一些數(shù)據(jù)結(jié)構(gòu)。
你可以去后盾人平臺看看,里面的東西不錯
本文標(biāo)題:php迭代器處理數(shù)據(jù) php迭代器的作用
標(biāo)題URL:http://jinyejixie.com/article36/ddisssg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、微信小程序、用戶體驗、域名注冊、電子商務(wù)、關(guān)鍵詞優(yōu)化
聲明:本網(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)