迭代器

yield是php提供的迭代器的使用關(guān)鍵字

一般php使用foreach時(shí)會(huì)拷貝傳入的數(shù)組參數(shù),然后一直循環(huán)完所有元素,如果是很大的數(shù)組或集合,那么通過(guò)foreach寫(xiě)入內(nèi)存很可能造成充滿內(nèi)存或超時(shí)(默認(rèn)30秒),如果在循環(huán)中使用yield,那么循環(huán)就不會(huì)產(chǎn)生上述現(xiàn)象,因?yàn)榈魇且淮螆?zhí)行一個(gè)循環(huán),然后會(huì)交出程序的控制權(quán),運(yùn)行其他程序,待其他程序執(zhí)行完再次切換回來(lái)繼續(xù)執(zhí)行,直至循環(huán)完畢返回false,迭代器也就終止。

function gen() {

? ? $ret = (yield 'yield1');

? ? var_dump($ret);

? ? $ret = (yield 'yield2');

? ? var_dump($ret);

}

$gen = gen();

var_dump($gen->current());? ? // string(6) "yield1"

var_dump($gen->send('ret1')); // string(4) "ret1"? (the first var_dump in gen)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // string(6) "yield2" (the var_dump of the ->send() return value)

var_dump($gen->send('ret2')); // string(4) "ret2"? (again from within gen)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // NULL? ? ? ? ? ? ? (the return value of ->send())

迭代器指一個(gè)集合,能用next不斷產(chǎn)生下一個(gè)元素的集合,直至完結(jié),返回false,但是還不止是一個(gè)結(jié)合,因?yàn)榈骺梢园瑹o(wú)限個(gè)元素,一般的結(jié)合(數(shù)組、對(duì)象、結(jié)果集。。)不可能包含無(wú)限個(gè)元素,機(jī)器不允許,而且,迭代器的工作是惰性的,你需要的時(shí)候會(huì)給你產(chǎn)生你要的數(shù)據(jù),不需要的時(shí)候,不會(huì)產(chǎn)生詳情的數(shù)據(jù),這就區(qū)別于用foreach循環(huán)一個(gè)數(shù)組的時(shí)候,會(huì)一下將整個(gè)數(shù)據(jù)拷貝加入內(nèi)存中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容