搜尋
首頁後端開發php教程php生成器詳細介紹

php生成器詳細介紹

Mar 06, 2018 pm 01:09 PM
php介紹詳細

首先讓我們看下PHP官方文件中是怎麼介紹的吧:生成器提供了一種更容易的方法來實現簡單的物件迭代,相比較定義類別實作Iterator 介面的方式,效能開銷和複雜性大大降低。

看了這句話,我們可以獲得幾個關鍵字: 物件迭代、 Iterator 介面、效能開銷 ,比較抽象,talk is cheap show me the code,下面我們從一個生成器最經典的例子開始吧。

PHP中的range() 函數在使用的時候會在記憶體中建立一個包含指定範圍單元的陣列並返回,一般來說,這個並沒什麼不妥,但是當所傳的limit入參值很大的時候,那麼也意味著將會在記憶體中創建的陣列也會很大,這個就太恐怖了,這是要乾爆記憶體的節奏啊。此時我們可以透過生成器來實作一個更有效率的range函數,(下面的程式碼是把PHP官方文件精簡處理了一下):

function xrange($start, $limit, $step = 1)
{
    //校验参数,此处省略

    for ($i = $start; $i <= $limit; $i += $step) {
        //向外产出值
        yield $i;
    }
}

//xrange此时返回的是一个生成器对象
$gen = xrange(1, 9);

//对生成器进行迭代
foreach ($gen as $number) {
    echo "$number ";
}

這裡在xrange和range函數的效果相同,均是產生了一個可迭代的變量,但是不同的是,range函數有點像ORM裡面常說的 預載 ,而xrange則是 懶載入 只是等到迭代到那個點才會產生對應的值,因此xrange並不需要分配大塊內存來存放變量,大大節約了內存,提升效率。

現在我們來總結下生成器和普通函數有哪些異同:

  1. #生成器中必須包含yield關鍵字(用來產生結果),而且可以是多次出現,在普通函數中向外部傳回結果只能使用return,且函數執行完畢;

  2. #一個生成器不可以透過return回傳值,這樣做會產生一個編譯錯誤PHP Fatal error: Generators cannot return values using "return"(注意:這個在PHP7下面不會出錯,但是會終止生成器繼續執行,即調valid()方法會返回false,然而在PHP5中return空是一個有效的語法並且它將終止生成器繼續執行)

生成器類別(Generator)

Generator 物件是從生成器傳回的,上面程式碼$gen就是一個生成器物件。注意,生成器物件和其他類別的物件不同,它並不能透過new關鍵字創建,只能從生成器函數取得。首先我們看下Generator類別摘要來看看其組成:

Generator implements Iterator
{
    /**
     * 返回当前产生的值(yield后面表达式的值)
     */
    public mixed current ( void )

    /**
     * yield的键(yield &#39;key&#39;=>&#39;val&#39;;)
     */
    public mixed key ( void )

    /**
     * 从上一个yield之后继续执行,直到下一个yield
     */
    public void next ( void )

    /**
     * 重置迭代器(对于生成器并没什么卵用)
     */
    public void rewind ( void )

    /**
     * 向生成器中传入一个值,并从上一个yield之后继续执行
     */
    public mixed send ( mixed $value )

    /**
     * 向生成器中抛出一个异常,并从上一个yield之后继续执行
     */
    public void throw ( Exception $exception )

    /**
     * 检查迭代器是否被关闭(false表示已关闭)
     */
    public bool valid ( void )

    /**
     * 序列化回调,但是生成器不能被序列化,因此会抛出一个异常
     */
    public void __wakeup ( void )
}

從上面的類別摘要可以看出,Generator類別是實作Iterator介面的,因此它具有迭代器的特性。另外它加入了send()、throw()和__wekeup()方法,相關方法說明已經寫了註釋,在此不再贅述。

寫了一堆,發現我的文筆不好,還是畫個圖感受一下吧(圖畫的也不美觀,大家湊合著看吧,2333)

yield關鍵字

接下來讓我們看下yield關鍵字,它最簡單的呼叫形式看起來像普通函數的return,不同之處在於普通return會傳回值並終止函數的執行,而yield會傳回一個值給循環呼叫此生成器的程式碼,並且只是暫停執行生成器函數。

這是一個典型的yield表達式:$data = yield $key => $value;,表達式包括兩部分:

注意:PHP5需要加上括號$data = (yiel
<br/>
d $key => $value);,否則會產生一個編譯錯誤,PHP7就不用關心這個了
  • 其一,是yield後面的表達式,這個可以是單一值也可以是鍵值對,與array中的一個元素對應,這部分錶達式是傳回給上層呼叫的,也就是上層可以透過current方法接收到值或是執行send方法的回傳值;

  • 另外一塊就是yield關鍵字本身,個人把他理解成一個接收器,會收到send方法傳入的值,這個值就是整個yield表達式目前的值,可以被左邊的變數接收。

這麼說可能有點抽象,還是上圖吧:

#產生器委託(yield from)

PHP7新增了yield from關鍵字,該語法開始允許從其他的generator,Traversable對象,或陣列透過yield from 產生數函數來yield值。 yield from的各種特性與yield一樣都是產生數據,只是後面跟隨的表達式不同。下面看個例子(摘自PHP官方文檔):

function count_to_ten()
{
    yield 1;
    yield 2;
    yield from [3, 4];  //生成数组
    yield from new ArrayIterator([5, 6]);   //生成可遍历对象
    yield from seven_eight();   //生成生成器对象
    yield 9;
    yield 10;
}

function seven_eight()
{
    yield 7;
    yield from eight();
}

function eight()
{
    yield 8;
}

foreach (count_to_ten() as $num) {
    echo "$num ";
}

//输出:1 2 3 4 5 6 7 8 9 10

yield from以方便我们编写比较清晰生成器嵌套,这点可以类比于函数中的嵌套调用,当函数A中调用另一个函数B,此时会等B执行完成并返回,方才继续执行。在没有yield from的时候,实现生成器嵌套需要自己实现栈并进行压栈和弹出操作以达到相同效果,那是多么痛苦的操作。

相关推荐:

php生成器简介和示例

php生成器对象

PHP生成器简单实例,php生成器_PHP教程

以上是php生成器詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
可以在PHP會話中存儲哪些數據?可以在PHP會話中存儲哪些數據?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,數字,數組和原始物。

您如何開始PHP會話?您如何開始PHP會話?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考慮使用AttActAcks.s.s.4)

什麼是會話再生,如何提高安全性?什麼是會話再生,如何提高安全性?May 02, 2025 am 12:15 AM

會話再生是指在用戶進行敏感操作時生成新會話ID並使舊ID失效,以防會話固定攻擊。實現步驟包括:1.檢測敏感操作,2.生成新會話ID,3.銷毀舊會話ID,4.更新用戶端會話信息。

使用PHP會話時有哪些性能考慮?使用PHP會話時有哪些性能考慮?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显著影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP會話與Cookie有何不同?PHP會話與Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具