• 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]);
    

      

  • 相关阅读:
    javaBean的理解
    配置tomcat8数据源(采用局部数据源方式)
    windows下apache报os 10048错误
    Windows下Apache的下载安装启动停止
    java通过数据库连接池链接oracle
    java连接oracle数据库
    eclipse配置svn方法
    JAVA多线程中start方法与run方法区别
    java程序在没有java环境的电脑上执行的方法(关键词jar,exe)
    js监听不到组合键
  • 原文地址:https://www.cnblogs.com/isuben/p/7061448.html
Copyright © 2020-2023  润新知