Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> PHP

PHP Generator class

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