來(lái)源:不言 發(fā)布時(shí)間:2018-08-13 09:48:30 閱讀量:945
本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于PHP中迭代器以及生成器的分析以及優(yōu)缺點(diǎn)的介紹,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。
一.迭代器
分析:想一下,如果把集合對(duì)象和對(duì)集合對(duì)象的操作放在一起,當(dāng)我們想換一種方式遍歷集合對(duì)象中元素時(shí),就需要修改集合對(duì)象了,違背“單一職責(zé)原則”,而迭代器模式將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的算法分離開(kāi),兩者可獨(dú)立發(fā)展。
優(yōu)點(diǎn):
1.支持多種遍歷方式。比如有序列表,我們根據(jù)需要提供正序遍歷、倒序遍歷兩種迭代器。用戶只需要得到我們的迭代器,就可以對(duì)集合執(zhí)行遍歷操作
2.簡(jiǎn)化了聚合類。由于引入了迭代器,原有的集合對(duì)象不需要自行遍歷集合元素了
3.增加新的聚合類和迭代器類很方便,兩個(gè)維度上可各自獨(dú)立變化
4.為不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上操作
缺點(diǎn):
1.迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離增加新的集合對(duì)象時(shí)需要增加對(duì)應(yīng)的迭代器類,類的個(gè)數(shù)成對(duì)增加,在一定程度上增加系統(tǒng)復(fù)雜度
具體接口:
Iterator
extends
Traversable {
/* 方法 */
abstract
public
mixed current ( void )
abstract
public
scalar key ( void )
abstract
public
void next ( void )
abstract
public
void
rewind
( void )
abstract
public
bool valid ( void )
}
二.生成器
PHP生成器(generator)是PHP5.5.0引入的功能,與標(biāo)準(zhǔn)的PHP迭代器不同,PHP生成器不要求類實(shí)現(xiàn)Iterator接口,從而減輕了類的負(fù)擔(dān),生成器會(huì)根據(jù)需求計(jì)算并產(chǎn)出要迭代的值,這對(duì)性能有重大的影響試想一下假如標(biāo)準(zhǔn)的PHP迭代器經(jīng)常在內(nèi)存中執(zhí)行迭代操作者要預(yù)先計(jì)算出數(shù)據(jù)集性能低下;如果要使用特定的的方式對(duì)計(jì)算大量數(shù)據(jù),對(duì)性能的影響更甚。此時(shí)我們可以使用生成器,即時(shí)計(jì)算產(chǎn)出后續(xù)值不占用寶貴的內(nèi)存資源。
優(yōu)點(diǎn):占用內(nèi)存少對(duì),性能好。每次產(chǎn)出一個(gè)值之后,生成器的內(nèi)部狀態(tài)都會(huì)停頓;當(dāng)生成器請(qǐng)求下一個(gè)值時(shí),內(nèi)部狀態(tài)又會(huì)恢復(fù)。生成器的內(nèi)部一直在停頓和恢復(fù)之間切換,直到循環(huán)完成或停頓位置
缺點(diǎn):
1.PHP生成器不能滿足所有迭代器的需求,因?yàn)槿绻徊樵儯善饔肋h(yuǎn)不知道下一個(gè)要迭代的值是什么,在生成器中無(wú)法后退或前進(jìn)。
2.生成器還是一次性的,無(wú)法多次迭代同一個(gè)生成器,不過(guò),如果需要,可以重建或克隆生成器。
創(chuàng)建生成器:
1.因?yàn)樯善骶褪荘HP函數(shù),生成器就是在函數(shù)中使用yield關(guān)鍵字。與普通的PHP函數(shù)不同的是,生產(chǎn)器從不返回值,只產(chǎn)出值。
<?php
function
myGenerator(){
yield
'a'
;
yield
'b'
;
yield
'c'
;
}
2.調(diào)用生成器函數(shù)時(shí),PHP會(huì)返回一個(gè)屬于Generator類的對(duì)象。這個(gè)對(duì)象可以使用foreach()函數(shù)迭代。每次迭代,PHP會(huì)要求Generator實(shí)例計(jì)算并提供下一個(gè)要迭代的值
<?php
function
makeRange(
$length
){
for
(
$i
= 0;
$i
<
$length
;
$i
++){
yield
$i
;
}
}
foreach
(makeRange(1000000)
as
$i
){
echo
$i
,PHP_EOL;
}
如上所示:當(dāng)$length 很大時(shí)(上百萬(wàn)),而且你同時(shí)沒(méi)有使用生成器的話,那么就要預(yù)先為一個(gè)由一百萬(wàn)上一千五個(gè)整數(shù)組成的數(shù)組分配內(nèi)存。而PHP生成器能實(shí)現(xiàn)相同的操作,不過(guò)一次只會(huì)為一個(gè)整數(shù)分配內(nèi)存
相關(guān)推薦:
php使用位運(yùn)算實(shí)現(xiàn)整數(shù)的加減乘除并測(cè)試(代碼示例)
PHP和html表單之間實(shí)現(xiàn)簡(jiǎn)單交互的代碼
以上就是PHP中迭代器以及生成器的分析以及優(yōu)缺點(diǎn)的介紹的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信