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

Generator (Trình sinh) trong PHP

Giới thiệu

Duyệt qua một tập dữ liệu lớn bằng cấu trúc lặp như foreach sẽ yêu cầu bộ nhớ lớn và thời gian xử lý đáng kể. Với generator, có thể lặp qua tập dữ liệu mà không tốn chi phí này. Hàm generator tương tự hàm bình thường. Tuy nhiên, thay vì câu lệnh return, generator dùng từ khóa yield để thực thi liên tục cung cấp giá trị cho vòng lặp.

Từ khóa yield là cốt lõi của cơ chế generator. Mặc dù dùng có vẻ 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 thực thi hàm.

Yielding values (Sinh giá trị)

Vòng lặp for sinh từng giá trị của biến lặp bên trong hàm generator:

<?php
function squaregenerator() {
    for ($i = 1; $i <= 5; $i++) {
        yield $i * $i;
    }
}
$gen = squaregenerator();
foreach ($gen as $val) {
    echo $val . " ";
}
?>

Khi foreach cố hiển thị $val lần đầu, squaregenerator sinh phần tử đầu, giữ $i và tạm dừng cho đến lần lặp tiếp theo. Kết quả tương tự foreach thông thường:

1 4 9 16 25

Triển khai range() như generator

Hàm range() của PHP trả về danh sách số nguyên từ $start đến $stop với bước $step. Chương trình sau triển khai range() như generator:

<?php
function rangegenerator($start, $stop, $step) {
    for ($i = $start; $i <= $stop; $i += $step) {
        yield $i;
    }
}
foreach (rangegenerator(2, 10, 2) as $val) {
    echo $val . " ";
}
?>

Kết quả

2 4 6 8 10

Mảng liên hợp (Associative array) như generator

<?php
function arrgenerator($arr) {
    foreach ($arr as $key => $val) {
        yield $key => $val;
    }
}
$arr = array("one" => 1, "two" => 2, "three" => 3, "four" => 4);
$gen = arrgenerator($arr);
foreach ($gen as $key => $val) {
    echo $key . "=>" . $val . "\n";
}
?>

Kết quả

one=>1
two=>2
three=>3
four=>4