求解答:yield 方式写法跟这种调用的写法什么区别?

yield 方式写法跟这种调用的写法什么区别?

//普通方式
function getLines($file){
        $file = fopen($file,'r');
        try{
            while(! feof($file)){
                $line = fgets($file);
                show($line);
            }
        }finally{
            fclose($file);
        }
    }

    function show($line){
        echo $line.'<br>';
    }
    
    $data = getLines('1.csv');

//生成器方式

function getLines($file){
        $file = fopen($file,'r');
        try{
            while(! feof($file)){
                $line = fgets($file);
                yield $line;
            }
        }finally{
            fclose($file);
        }
    }

    $data = getLines('1.csv');
    foreach($data as $n=>$line){
        echo $line.'<br>';
    }
阅读 3.7k
4 个回答

每次进行yield操作, 可以把程序的控制权从函数内移到函数外, 同时可以给yield语句往内传值.

使用yield可以节省内存,生成的数据是foreach每遍历一条便执行一次,不用将所有数据一次性加载到内存中

你写的代码本职区别就是协程理念

在你这段代码里除了多了概念,运行基本区别没有,都是一次fgets阻塞,实际是没有利用协程让什么cpu

为什么要用 try finally ,直接在 while 外写 fclose 怎么样

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题