使用php yield / Generator :: send()获取“数据输出流”
发布时间:2020-12-13 16:05:57 所属栏目:PHP教程 来源:网络整理
导读:我知道yield可用于创建数据迭代器,例如从CSV文件中读取数据. function csv_generator($file) { $handle = fopen($file,"r"); while (!feof($handle)) { yield fgetcsv($file); } fclose($file);} 但是Generator :: send()方法表明我可以为顺序写入而不是读取
我知道yield可用于创建数据迭代器,例如从CSV文件中读取数据.
function csv_generator($file) { $handle = fopen($file,"r"); while (!feof($handle)) { yield fgetcsv($file); } fclose($file); } 但是Generator :: send()方法表明我可以为顺序写入而不是读取做同样的事情. 例如.我想用这样的东西: function csv_output_generator($file) { $handle = fopen('file.csv','w'); while (null !== $row = yield) { fputcsv($handle,$row); } fclose($handle); } $output_generator = csv_output_generator($file); $output_generator->send($rows[0]); $output_generator->send($rows[1]); $output_generator->send($rows[2]); // Close the output generator. $output_generator->send(null); 我想,上面的内容会奏效. 但是$output_generator-> send(null);关闭似乎错了,或者不理想.这意味着我永远不会发送文字null.对于csv编写来说这是好的,但也许有一个用于发送null的用例. 使用php生成器进行顺序编写是否有“最佳实践”? 解决方法
不是说这是一个了不起的想法,但如果你在谈论语义,那就“感觉”很棒.
检查班级.像传递特定类的对象来终止生成器一样.喜欢: // should probably use namespacing here. class GeneratorUtilClose {} class GeneratorUtil { public static function close() { return new GeneratorUtilClose; } } function csv_output_generator($file) { $handle = fopen('file.csv','w'); while (!(($row = yield) instanceof GeneratorUtilClose)) { fputcsv($handle,$row); } fclose($handle); } $output_generator = csv_output_generator($file); $output_generator->send($rows[0]); $output_generator->send(GeneratorUtil::close()); 在这里添加了一个小工厂,用于额外的语义糖. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |