• PHP生成器yield使用示例


    <?php
    function getLines($file) {
        $f = fopen($file, 'r');
        try {
            while ($line = fgets($f)) {
                yield $line;
            }
        } finally {
            fclose($f);
        }
    }
    
    foreach (getLines("sql.txt") as $n => $line) {
        echo $line; //逐行输出大文件
    }
    
    
    
    /*-----------------------------------------------------------------------*/
    function xrange($start, $end, $step = 1) {  
        for ($i = $start; $i <= $end; $i += $step) {  
            yield $i;  
        }  
    }  
    
    foreach (xrange(1, 1000) as $num) {  
        echo $num, "
    ";  //生成大数组
    } 
    
    
    
    
    
    /*-----------------------------------------------------------------------*/
    function get(){
        $sql = "select * from `user` limit 0,500000000";
        $stat = $pdo->query($sql);
        while ($row = $stat->fetch()) {
            yield $row;//逐行读出数据库行
        }
    }
    
    foreach (get() as $row) {
        var_dump($row);
    } 
    
    
    
    
    
    /*-----------------------------------------------------------------------------*/
    function middleware($handlers,$arguments = []){
        //函数栈
        $stack = [];
        $result = null;
    
        foreach ($handlers as $handler) {
            // 每次循环之前重置,只能保存最后一个处理程序的返回值
            $result = null;
            $generator = call_user_func_array($handler, $arguments);
    
            if ($generator instanceof Generator) {
                //将协程函数入栈,为重入做准备
                $stack[] = $generator;
    
                //获取协程返回参数
                $yieldValue = $generator->current();
    
                //检查是否重入函数栈
                if ($yieldValue === false) {
                    break;
                }
            } elseif ($generator !== null) {
                //重入协程参数
                $result = $generator;
            }
        }
    
        $return = ($result !== null);
        //将协程函数出栈
        while ($generator = array_pop($stack)) {
            if ($return) {
                $generator->send($result);
            } else {
                $generator->next();
            }
        }
    }
    $abc = function(){
        echo "this is abc start 
    ";
        yield;
        echo "this is abc end 
    ";
    };
    
    $qwe = function (){
        echo "this is qwe start 
    ";
        $a = yield;
        echo $a."
    ";
        echo "this is qwe end 
    ";
    };
    $one = function (){
        return 1;
    };
    
    middleware([$abc,$qwe,$one]);
    

      

  • 相关阅读:
    Vue常见问题总结
    vue学习记录
    内卷
    at least once 和 at most once 问题
    IO学习笔记(全)
    IO学习笔记7
    IO学习笔记6
    IO学习笔记5
    IO学习笔记4
    IO学习笔记3
  • 原文地址:https://www.cnblogs.com/isuben/p/7061448.html
Copyright © 2020-2023  润新知