1. 程式人生 > 其它 >php 中 yield 的使用

php 中 yield 的使用

php 中 yield 的使用

首先我們帶著幾個問題來找答案

  • yild 是什麼

yield 在使用場景上,直觀的檢視程式碼,和 return 有點像。 實際他們是截然不同的東西, 它是一個生成器, 只有在你呼叫他的時候才會執行,並不產生多餘的值,這個東西放到我們下面來講

  • yield有關的東西是什麼

Generator: http://php.net/manual/zh/class.generator.php

話不多說太多, 別人寫的或許比我更透徹

https://www.cnblogs.com/zuochuang/p/8176868.html

相關的例子:

<?php 

function getUsers(){
    $names = ['小明', '小紅', '小黑'];
    
    foreach($names as $name) {
        yield $name;
    }
}

# getUsers() 中 yield 構造出的是一個生成器
# 生成器是什麼, 見 ex2.php

$generator = getUsers();

foreach($generator as $name) {
    echo $name;
}

echo $names; # 小明小紅小黑

ex2.php

<?php 

function getUsers(){
    $names = ['小明', '小紅', '小黑'];
    
    foreach($names as $key => $name) {
        yield $key => $name;
    }
}

$generators = getUsers();


foreach($generators as $generator) {
    echo $generators->current(); # 當前迭代的內容
    $generators->next();  #
替代遍歷,手動執行一次 echo $generators->key(); # 迭代器的key // $generators->rewind(); # 重置迭代器 , 它會將迭代器跑一遍,我們可以在使用迭代器之前用於對資料進行測試,捕獲錯誤行為 # 如果迭代器正在執行,將會丟擲錯誤 echo $generators->current(); }

read.php

<?php

# 使用平常的方法寫入1萬條資料
$content = "使用平常的方法寫入1萬條資料\r\n";

$stime = microtime(true);
$smemory
= memory_get_usage(); $i = 0; $handle = fopen(__DIR__ . '/test.txt', 'r'); function handler($handle){ while( !feof($handle) ) { $c = fgets($handle); yield $c; } } $data = handler($handle); foreach($data as $value) { echo $value; } fclose($handle); $etime = microtime(true); $ememory = memory_get_usage(); $runtime = round(($etime - $stime), 3); # 執行時間 $memory_usage = $ememory - $smemory; # 消耗的記憶體 echo "執行時間" . $runtime . " \r\n" . "消耗的記憶體" . $memory_usage . " \r\n";

總之, yield 強調的是用即調之,例如讀取檔案的時候不需要提前去記憶體取出這些資料,再一一獲取。 而yield則解決了這些問題,他只記錄一條資訊,那就是你執行到哪兒了。 再根據你的位置進行下一步

程式碼示例地址 : https://github.com/surest-sky/example/tree/master/yield