真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP7中生成器的新特性有哪些

這篇文章主要介紹PHP7中生成器的新特性有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)專注網(wǎng)站設(shè)計(jì),以設(shè)計(jì)驅(qū)動(dòng)企業(yè)價(jià)值的持續(xù)增長,網(wǎng)站,看似簡單卻每一個(gè)企業(yè)都需要——設(shè)計(jì),看似簡潔卻是每一位設(shè)計(jì)師的心血 十年來,我們只專注做網(wǎng)站。認(rèn)真對待每一個(gè)客戶,我們不用口頭的語言來吹擂我們的優(yōu)秀,千余家的成功案例見證著我們的成長。

生成器委托

簡單地翻譯官方文檔的描述:

PHP7中,通過生成器委托(yield from),可以將其他生成器、可迭代的對象、數(shù)組委托給外層生成器。外層的生成器會(huì)先順序 yield 委托出來的值,然后繼續(xù) yield 本身中定義的值。

利用 yield from 可以方便我們編寫比較清晰生成器嵌套,而代碼嵌套調(diào)用是編寫復(fù)雜系統(tǒng)所必需的。

上例子:

以上將輸出:

foo iteration 1
foo iteration 2
foo iteration 3
foo iteration 4
foo iteration 5
foo iteration 6
foo iteration 7
foo iteration 8
foo iteration 9
foo iteration 10
---
bar iteration 1
bar iteration 2
bar iteration 3
bar iteration 4
bar iteration 5

自然,內(nèi)部生成器也可以接受它的父生成器發(fā)送的信息或者異常,因?yàn)?yield from 為父子生成器建立一個(gè)雙向的通道。不多說,上例子:

send($num);
}
$gen->send(null);
foreach (range(1,5) as $num) {
    $gen->send($num);
}
//$gen->send("hello world"); //try it ,gay

輸出和上個(gè)例子是一樣的。

生成器返回值

如果生成器被迭代完成,或者運(yùn)行到 return 關(guān)鍵字,是會(huì)給這個(gè)生成器返回值的。
可以有兩種方法獲取這個(gè)返回值:

  1. 使用 $ret = Generator::getReturn() 方法。

  2. 使用 $ret = yield from Generator() 表達(dá)式。

上例子:

getReturn();
}

foreach (task() as $item) {
    ;
}

輸出結(jié)果就不貼了,想必大家都猜到。

可以看到 yield from 和 return 結(jié)合使得 yield 的寫法更像平時(shí)我們寫的同步模式的代碼了,畢竟,這就是 PHP 出生成器特性的原因之一呀。

一個(gè)非阻塞的web服務(wù)器

時(shí)間回到2015年,鳥哥博客上轉(zhuǎn)載的一篇《 在PHP中使用協(xié)程實(shí)現(xiàn)多任務(wù)調(diào)度》。文章介紹了PHP5 的迭代生成器,協(xié)程,并實(shí)現(xiàn)了一個(gè)簡單的非阻塞 web 服務(wù)器。(鏈接見文末引用)

現(xiàn)在我們利用 PHP7 中的這兩個(gè)新特性重寫這個(gè) web 服務(wù)器,只需要 100 多行代碼。

代碼如下:

socket = $socket;
        $this->masterCoSocket = $master ?? $this;
    }

    public function accept()
    {
        $isSelect = yield from $this->onRead();
        $acceptS = null;
        if ($isSelect && $as = stream_socket_accept($this->socket, 0)) {
            $acceptS = new CoSocket($as, $this);
        }
        return $acceptS;
    }

    public function read($size)
    {
        yield from $this->onRead();
        yield ($data = fread($this->socket, $size));
        return $data;
    }

    public function write($string)
    {
        yield from $this->onWriter();
        yield fwrite($this->socket, $string);
    }

    public function close()
    {
        unset($this->masterCoSocket->streamPoolRead[(int)$this->socket]);
        unset($this->masterCoSocket->streamPoolWrite[(int)$this->socket]);
        yield ($success = @fclose($this->socket));
        return $success;
    }

    public function onRead($timeout = null)
    {
        $this->masterCoSocket->streamPoolRead[(int)$this->socket] = $this->socket;
        $pool = $this->masterCoSocket->streamPoolRead;
        $rSocks = [];
        $wSocks = $eSocks = null;
        foreach ($pool as $item) {
            $rSocks[] = $item;
        }
        yield ($num = stream_select($rSocks, $wSocks, $eSocks, $timeout));
        return $num;
    }

    public function onWriter($timeout = null)
    {
        $this->masterCoSocket->streamPoolWrite[(int)$this->socket] = $this->socket;
        $pool = $this->masterCoSocket->streamPoolRead;
        $wSocks = [];
        $rSocks = $eSocks = null;
        foreach ($pool as $item) {
            $wSocks[] = $item;
        }
        yield ($num = stream_select($rSocks, $wSocks, $eSocks, $timeout));
        return $num;
    }

    public function onRequest()
    {
        /** @var self $socket */
        $socket = yield from $this->accept();
        if (empty($socket)) {
            return false;
        }
        $data = yield from $socket->read(8192);
        $response = call_user_func($this->handleCallback, $data);
        yield from $socket->write($response);
        return yield from $socket->close();
    }

    public static function start($port, callable $callback)
    {
        echo "Starting server at port $port...\n";
        $socket = @stream_socket_server("tcp://0.0.0.0:$port", $errNo, $errStr);
        if (!$socket) throw new Exception($errStr, $errNo);
        stream_set_blocking($socket, 0);
        $coSocket = new self($socket);
        $coSocket->handleCallback = $callback;
        function gen($coSocket)
        {
            /** @var self $coSocket */
            while (true) yield from $coSocket->onRequest();
        }
        foreach (gen($coSocket) as $item){};
    }
}

CoSocket::start(8000, function ($data) {
    $response = <<

以上是“PHP7中生成器的新特性有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


本文名稱:PHP7中生成器的新特性有哪些
文章源于:http://weahome.cn/article/jpshjj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部