5

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ジェネレーターを使用するための「ベストプラクティス」はありますか?

4

2 に答える 2