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

Generator vs Đối tượng Iterator trong PHP

Giới thiệu

Khi hàm generator được gọi, nội bộ nó trả về một đối tượng mới của class Generator. Class này implements giao diện Iterator. Giao diện Iterator định nghĩa các phương thức trừu tượng sau:

  • Iterator::current — Trả về phần tử hiện tại
  • Iterator::key — Trả về khóa của phần tử hiện tại
  • Iterator::next — Di chuyển tới phần tử tiếp theo
  • Iterator::rewind — Quay lại phần tử đầu tiên
  • Iterator::valid — Kiểm tra vị trí hiện tại có hợp lệ

Generator hoạt động như một đối tượng forward-only iterator (chỉ tiến tới), và cung cấp các phương thức có thể gọi để thao tác trạng thái của generator, bao gồm gửi giá trị vào và trả giá trị từ nó.

Generator như Iterator

Trong ví dụ sau, hàm generator sinh các dòng trong file vào đối tượng generator có thể duyệt bằng foreach. Các phương thức Iterator như current() và next() cũng có thể gọi. Tuy nhiên, vì generator là forward-only iterator, gọi phương thức rewind() sẽ ném exception.

<?php
function filegenerator($name) {
    $fileHandle = fopen($name, 'r');
    while ($line = fgets($fileHandle)) {
        yield $line;
    }
    fclose($fileHandle);
}
$name = "test.txt";
$file = filegenerator($name);
foreach ($file as $line) echo $line;
$file->rewind();
echo $file->current();
$file->next();
echo $file->current();
?>

Kết quả

Sau khi duyệt xong các dòng file, lỗi fatal sau hiển thị:

PHP Fatal error: Uncaught Exception: Cannot rewind a generator that was already run

Lưu ý: Generator không hỗ trợ rewind() sau khi đã chạy, khác với Iterator thông thường.