国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP的yield是個(gè)什么玩意(一)

fxp / 1174人閱讀

摘要:這個(gè)關(guān)鍵字到底返回的是什么我們簡(jiǎn)單看一下返回的是一個(gè)叫做中文名就是生成器的對(duì)象,而這個(gè)生成器是實(shí)現(xiàn)了接口至于接口,你們?nèi)ナ謨?cè)上搜索吧。

其實(shí),我并不是因?yàn)榈蛘呱善骰蛘哐芯縋HP手冊(cè)才認(rèn)識(shí)的yield,要不是協(xié)程,我到現(xiàn)在也不知道PHP中還有yield這么個(gè)鬼東西。人家這個(gè)東西是從PHP 5.5就開始引入了,官方名稱叫做生成器。你要說(shuō)為什么5.5年代的東西,現(xiàn)在才拿出來(lái)。我還想問(wèn)你喲,PHP 5.3就有了的namespace為毛到最近這幾年才開始正式投產(chǎn)。

那么,問(wèn)題來(lái)了,這東西到底是有何用?

先來(lái)感受一個(gè)問(wèn)題,給你100Kb的內(nèi)存(是的,你沒(méi)有看錯(cuò),就是100Kb),然后讓你迭代輸出一個(gè)從1開始一直到10000的數(shù)組,步進(jìn)為1。

愈先迭代數(shù)組,必先創(chuàng)造數(shù)組。

所以,腦門一拍,代碼一坨如下:


一頓操作猛如虎,運(yùn)行一下成績(jī)1-5,你們感受一下:

528440bytes,約莫就是528Kb,幾乎是100Kb的五倍了,媽的這日子沒(méi)法過(guò)了。

畢竟你們也知道,最近內(nèi)存價(jià)格確實(shí)貴,國(guó)家也在號(hào)召低碳節(jié)能減排,你多耗費(fèi)5倍內(nèi)存,就意味著多排放5倍的二氧化碳,就意味著要為多用的內(nèi)存多花錢貢獻(xiàn)給棒子... ...你想想,那可是棒子。

人都是被逼出來(lái)的,于是yield可以來(lái)救場(chǎng)了,大概代碼如下,注意看操作:


運(yùn)行一下,你們感受一下:

首先,我們觀察一下yield_range這個(gè)函數(shù)跟普通函數(shù)不一樣的地方,就是普通函數(shù)往往都是使用return來(lái)返回結(jié)果,而這個(gè)中則是yield。其次是普通函數(shù)中return只能返回一次,這個(gè)yield能返回好多次。

那么,我們來(lái)分析一波兒這個(gè)神奇的yield_range函數(shù)。這個(gè)yield關(guān)鍵字到底返回的是什么?我們簡(jiǎn)單看一下:


yield返回的是一個(gè)叫做Generator(中文名就是生成器)的object對(duì)象,而這個(gè)生成器是實(shí)現(xiàn)了Iterator接口(至于Iterator接口,你們?nèi)HP手冊(cè)上搜索吧)。所以,既然實(shí)現(xiàn)了Iterator接口(也正是因?yàn)槿绱耍@個(gè)東西可以使用foreach進(jìn)行迭代,明白了吧?),所以可以有如下代碼:

valid() ){
  echo $generator->current().PHP_EOL;
  $generator->next();
}

運(yùn)行結(jié)果如下所示:

重點(diǎn)來(lái)了:這個(gè)yield_range函數(shù)似乎能夠記住它上一次運(yùn)行到哪兒了,上一次運(yùn)行的結(jié)果是什么,然后緊接著在下一次運(yùn)行的時(shí)候繼續(xù)從上次終止的地方繼續(xù)開始。這不是普通的PHP函數(shù)可以做得到的!

我們知道,操作系統(tǒng)在調(diào)度進(jìn)程的時(shí)候,會(huì)觸發(fā)一個(gè)叫做“進(jìn)程上下文切換”的概念。比如CPU從進(jìn)程A調(diào)度給進(jìn)程B了,那么當(dāng)再次從進(jìn)程B調(diào)度給進(jìn)程A的時(shí)候,當(dāng)初進(jìn)程A運(yùn)行到哪兒了、臨時(shí)的數(shù)據(jù)結(jié)果是什么都是需要被還原的,不然,一切都要從頭,那就要出大問(wèn)題了。而,這個(gè)yield關(guān)鍵字,似乎在用戶態(tài)(非系統(tǒng)內(nèi)核級(jí))就可以實(shí)現(xiàn)這個(gè)概念。所以說(shuō),用yield搞迭代,怕是真的很沒(méi)出息的一件事,它能做的太多。

緊接著,我們需要認(rèn)識(shí)一個(gè)生成器對(duì)象的一個(gè)方法,叫做send,簡(jiǎn)單看下下面這坨代碼:

send( $generator->current() * 10 );

運(yùn)行結(jié)果如圖所示:

send方法可以修改yield的返回值,但是,你也不能想當(dāng)然,比如下面這坨代碼,你們以為運(yùn)行結(jié)果是什么樣呢?

send( $generator->current() * 10 );
}

本來(lái)以為運(yùn)行結(jié)果是類似于這樣的:


然而,唯物主義告訴我們:

結(jié)果是打臉的,你們感受一下:

原因是什么呢?原因是當(dāng)你在外部向yield發(fā)送send的時(shí)候,會(huì)自動(dòng)觸發(fā)一次next,自己動(dòng)手試下吧。

最近開了一個(gè)微信公眾號(hào),所有文章都在這里(手賤弄成服務(wù)號(hào)了)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/30996.html

相關(guān)文章

  • 填坑之PHPyield和協(xié)程在日子里(二)

    摘要:粗暴地說(shuō)上面的過(guò)程就算是協(xié)程的基本概念。多線程和多進(jìn)程都是操作系統(tǒng)參與的調(diào)度,而協(xié)程是用戶自主實(shí)現(xiàn)的調(diào)度,協(xié)程的關(guān)鍵點(diǎn)實(shí)際上是用戶層實(shí)現(xiàn)自主調(diào)度,大概有翻身農(nóng)奴把歌唱的意思。 首先是,這是我第一次把公眾號(hào)文章復(fù)制粘貼到sf.gg來(lái)。 其次是,很久很久之前,我挖了一個(gè)yield的一個(gè)坑,自己挖的坑自己填,不然遲早會(huì)把自己埋掉。 最后是,如果想看之前那個(gè)坑,請(qǐng)發(fā)送yield給文章末尾的公眾...

    Scorpion 評(píng)論0 收藏0
  • generator探幽(1)--koa中間件機(jī)制淺析

    摘要:當(dāng)運(yùn)行到時(shí),不會(huì)暫停,而是直接跳進(jìn)函數(shù)執(zhí)行函數(shù)內(nèi)的代碼。由于函數(shù)中沒(méi)有,因此會(huì)一直執(zhí)行完函數(shù)中的代碼,并返回至函數(shù)中執(zhí)行后面的代碼。 本系列旨在通過(guò)對(duì)co,koa等庫(kù)源碼的研究,進(jìn)而理解generator在異步編程中的重大作用(ps:所有代碼請(qǐng)?jiān)趎ode --harmony或者iojs環(huán)境中運(yùn)行) koa中間件的形式 相信用過(guò)koa的小伙伴一定很熟悉下面這段代碼 var app ...

    Jensen 評(píng)論0 收藏0
  • ES6初探

    摘要:可以直譯為古怪到有魅力。里面基本上這些是被弱化了的,或者說(shuō)是被隱藏起來(lái)了。而之前的的語(yǔ)法使得入門的門檻變高了。但是,于此同時(shí),作為語(yǔ)言的獨(dú)特魅力被削弱了。應(yīng)該說(shuō),理解這些傳統(tǒng)的語(yǔ)法對(duì)也很有意義。因?yàn)楫吘惯@些只是被隱藏,而不是被剔除。 這兩天在看React的一些東西。接觸到了ES6。談?wù)勔恍┐譁\的看法。 ES6其實(shí)是個(gè)簡(jiǎn)稱。這東西學(xué)名叫做ECMAScript 2015,或者ES 2015...

    tianyu 評(píng)論0 收藏0
  • XSS全解析—初探

    摘要:持久型相當(dāng)于存儲(chǔ)型跨站腳本。這玩意兒涉及到一點(diǎn)和瀏覽器引擎解析的問(wèn)題。說(shuō)正事,是支持碼形式的。的調(diào)用有幾個(gè)概念我們先來(lái)了解一下。本來(lái)說(shuō)的只用天完成的,沒(méi)想到各種事兒拖了兩天,。 前些時(shí)間準(zhǔn)備面試的時(shí)候一直會(huì)遇到這個(gè)XSS,寥寥幾句話好像很簡(jiǎn)單,后來(lái)看到同學(xué)的《XSS跨站腳本攻擊剖析與防御》這本書,稍微翻看了一下,其中的學(xué)問(wèn)還是挺多的。這系列的文章就當(dāng)做讀書筆記吧。 什么是XSS 聽(tīng)過(guò)很...

    Lucky_Boy 評(píng)論0 收藏0
  • PHP7下協(xié)程實(shí)現(xiàn)

    摘要:把中的初始化方法改下,因?yàn)槲覀冊(cè)谶\(yùn)行一個(gè)的時(shí)候,我們要分析出他包含了哪些子協(xié)程,然后將子協(xié)程用一個(gè)堆棧保存。總結(jié)這下應(yīng)該明白怎么實(shí)現(xiàn)協(xié)程了吧建議不要使用的來(lái)實(shí)現(xiàn)協(xié)程,推薦使用,已經(jīng)支持了協(xié)程,并附帶了部分案例。 前言 相信大家都聽(tīng)說(shuō)過(guò)『協(xié)程』這個(gè)概念吧。 但是有些同學(xué)對(duì)這個(gè)概念似懂非懂,不知道怎么實(shí)現(xiàn),怎么用,用在哪,甚至有些人認(rèn)為yield就是協(xié)程! 我始終相信,如果你無(wú)法準(zhǔn)確地表達(dá)...

    young.li 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<