Giới thiệu
Duyệt tập dữ liệu lớn bằng foreach tốn nhiều bộ nhớ và thời gian. Với generators có thể lặp qua tập dữ liệu không tốn chi phí đó. Hàm generator tương tự hàm bình thường. Tuy nhiên, thay vì return, generator dùng từ khóa yield để thực thi lặp lại cung cấp giá trị cho vòng lặp.
Từ khóa yield là cốt lõi của generator. Dù trông giống return, nó không dừng thực thi hàm. Nó cung cấp giá trị tiếp theo cho vòng lặp và tạm dừng hàm.
Cú pháp
Generator implements Iterator { public current ( void ) : mixed public getReturn ( void ) : mixed public key ( void ) : mixed public next ( void ) : void public rewind ( void ) : void public send ( mixed $value ) : mixed public throw ( Throwable $exception ) : mixed public valid ( void ) : bool public __wakeup ( void ) : void }Phương thức
- Generator::current() - Lấy giá trị yield.
- Generator::getReturn() - Lấy giá trị return của generator.
- Generator::key() - Lấy khóa giá trị yield.
- Generator::next() - Tiếp tục thực thi generator. Tương đương Generator::send(NULL).
- Generator::rewind() - Quay lại đầu iterator. Nếu đã bắt đầu lặp, ném exception.
- Generator::send() - Gửi giá trị cho generator như kết quả yield hiện tại và tiếp tục.
- Generator::throw() - Ném exception vào generator và tiếp tục.
- Generator::valid() - Kiểm tra iterator đã đóng chưa.
- Generator::__wakeup() - Ném exception vì generator không serialize được.
Generator triển khai Iterator. Không khởi tạo Generator qua new. Hàm user có yield tạo đối tượng Generator.
Ví dụ Generator
Vì Generator triển khai Iterator, dùng foreach duyệt giá trị yield:
<?php function squaregenerator() { for ($i = 1; $i <= 5; $i++) { yield $i * $i; } } $gen = squaregenerator(); foreach ($gen as $val) { echo $val . " "; } ?>Kết quả
1 4 9 16 25
Ví dụ dùng current() và next() duyệt giá trị yield. Điều kiện lặp kiểm tra valid():
Ví dụ
<?php function squaregenerator() { for ($i = 1; $i <= 5; $i++) { yield $i * $i; } } $gen = squaregenerator(); while ($gen->valid()) { echo "key: " . $gen->key() . " value: " . $gen->current() . "\n"; $gen->next(); } ?>Kết quả
key: 0 value: 1 key: 1 value: 4 key: 2 value: 9 key: 3 value: 16 key: 4 value: 25