アプデ
6.0から追加された、LazyCollectionというクラスに、新しく eager()
が追加されました。
どんなことが起こる?
@return static`
なので、LazyCollectionが返されます。
そして、eagerが呼び出された時点での中身を使用してLazyCollectionが渡されます。
テストコードみて理解してみる
public function testEager() { $source = [1, 2, 3, 4, 5]; $data = LazyCollection::make(function () use (&$source) { yield from $source; })->eager(); $source[] = 6; $this->assertSame([1, 2, 3, 4, 5], $data->all()); }
$dataは$sourceを参照して値を返す。
$source[] = 6;
で参照先の値が変わっています。
ですが、$dataが定義された時点では、$sourceは[1,2,3,4,5]が参照されているので、$data->all()では[6]の値が含まれていません。
何が嬉しい?
LazyCollectionは、foreachなどが呼び出されたときに値の取得をします。
例えば、ログを取得して出力するLazyCollectionを作成したとき。
LazyCollectionを生成した時点ではログが1万行だったとして、その値がほしかったとき。
foreachで値を取得しようとしたときに、ログは変更され、1万100行だった場合には、1万100行取得してしまう。
それは困ると。LazyCollectionを生成した時点のデータがほしいんだ。
そんなときにeagerメソッドを使って生成すると良さそうですφ(・・