zoukankan      html  css  js  c++  java
  • 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]);
    

      

  • 相关阅读:
    由VMnet引起的browser-sync故障解决方案
    Gen8折腾日记
    实变函数笔记(1)——集合与基数
    密码学笔记(6)——复杂度及其相关内容
    微分几何笔记(1)——参数曲线、内积、外积
    密码学笔记(5)——Rabin密码体制和语义安全性
    密码学笔记(4)——RSA的其他攻击
    密码学笔记(2)——RSA密码
    密码学笔记(1)——数论准备知识
    第七章小结
  • 原文地址:https://www.cnblogs.com/isuben/p/7061448.html
Copyright © 2011-2022 走看看