亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

  • 站長(zhǎng)資訊網(wǎng)
    最全最豐富的資訊網(wǎng)站

    實(shí)例講解PHP里的Iterator和Generator

    在講解生成器之前先介紹一下迭代器:

    在 PHP 中,通常情況下遍歷數(shù)組使用 foreach 來(lái)遍歷。

    如果我們要想讓一個(gè)對(duì)象可以遍歷呢?

    PHP 為我們提供了 Iterator 接口,只要實(shí)現(xiàn)了這個(gè)接口,這個(gè)對(duì)象就可以通過(guò) foreach 來(lái)迭代。

    例子如下:

    class myIterator implements Iterator {     private $index = 0;     private $data = '';      public function __construct($data) {         $this->index = 0;         $this->data = $data;     }      function rewind() {         $this->index = 0;     }      function current() {         return $this->data[$this->index];     }      function key() {         return $this->index;     }      function next() {         ++$this->index;     }      function valid() {         return isset($this->data[$this->index]);     } }  $it = new myIterator(array(     "hello",     "php",     "iterator", )); foreach($it as $key => $value) {     echo "$key : $value<br>"; }

    我們通過(guò)foreach遍歷 $it 時(shí),PHP 會(huì)自己依次調(diào)用:

    rewind() 重置到第一個(gè)元素
    valid() 檢查當(dāng)前位置是否有效
    current() 返回當(dāng)前元素
    key() 返回當(dāng)前元素的鍵
    next() 指向下一個(gè)元素

    生成器是 PHP 5.5 引入的新特性,但是目前貌似很少人用到它。

    下面試 PHP 官方文檔上對(duì)生成器的解釋:

    生成器提供了一種更容易的方法來(lái)實(shí)現(xiàn)簡(jiǎn)單的對(duì)象迭代,相比較定義類實(shí)現(xiàn) Iterator 接口的方式,性能開(kāi)銷和復(fù)雜性大大降低。

    生成器允許你在 foreach 代碼塊中寫(xiě)代碼來(lái)迭代一組數(shù)據(jù)而不需要在內(nèi)存中創(chuàng)建一個(gè)數(shù)組, 那會(huì)使你的內(nèi)存達(dá)到上限,或者會(huì)占據(jù)可觀的處理時(shí)間。

    相反,你可以寫(xiě)一個(gè)生成器函數(shù),就像一個(gè)普通的自定義函數(shù)一樣, 和普通函數(shù)只返回一次不同的是, 生成器可以根據(jù)需要 yield 多次,以便生成需要迭代的值。

    為了體現(xiàn)生成器的有點(diǎn),下面我們定義一個(gè)函數(shù)來(lái)進(jìn)行比較:

    function func1() {     foreach (range(0, 1000000) as $value){         echo $value;     } }  func1(); // ( ! ) Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 402653192 bytes) in xxx.php on line 5

    因?yàn)閯?chuàng)建如此大的數(shù)組到內(nèi)存中進(jìn)行迭代,則 PHP 直接提示超出了單個(gè)進(jìn)程的內(nèi)存限制。

    下面我們換做生成器的方式來(lái)處理:

    function func1() {     foreach (range(0, 1000000) as $value){         yield $value;     } }  var_dump(func1()); // object(Generator)[1] foreach (func1() as $value){     echo $value; }

    可以看到我們調(diào)用 func1() 返回了一個(gè) Generator 對(duì)象,這個(gè)對(duì)象可以使用 foreach 迭代,每次迭代,PHP 會(huì)要求 Generator 實(shí)例計(jì)算并提供下一個(gè)要迭代的值。

    生成器的優(yōu)雅體現(xiàn)在每次產(chǎn)出一個(gè)值之后,生成器的內(nèi)部狀態(tài)都會(huì)停頓;

    向生成器請(qǐng)求下一個(gè)值時(shí),內(nèi)部狀態(tài)又會(huì)恢復(fù)。生成器內(nèi)部的狀態(tài)會(huì)一直在停頓和恢復(fù)之間切換,直到抵達(dá)函數(shù)定義體的末尾或遇到空的return語(yǔ)句為止。

    【推薦學(xué)習(xí):PHP視頻教程】

    贊(0)
    分享到: 更多 (0)
    網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)