Giới thiệu
Duyệt qua một tập hợp lớn dữ liệu bằng cách sử dụ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 máy phát điện có thể lặp lại một tập dữ liệu mà không có các chi phí này. Một chức năng máy phát điện tương tự như một chức năng bình thường. Tuy nhiên, thay vì câu lệnh trả về trong một hàm, trình tạo sử dụng năng suất từ khóa được thực thi lặp đi lặp lại để nó cung cấp các giá trị được lặp lại.
Từ khóa năng suất là trung tâm của cơ chế máy phát điện. Mặc dù việc sử dụng nó có vẻ tương tự như return, nhưng nó không ngừng thực thi chức năng. Nó cung cấp giá trị tiếp theo để lặp lại và tạm dừng thực thi chức năng.
Cú pháp
Generator implements Iterator { /* Methods */ 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 pháp
Trình tạo công cộng ::hiện tại (vô hiệu) - hỗn hợp - Nhận giá trị thu được
public Generator ::getReturn (void):mix - Nhận giá trị trả về của trình tạo
public Generator ::key (void) - hỗn hợp - Nhận khóa của giá trị sinh ra.
public Generator ::next (void) - void - Tiếp tục thực hiện máy phát điện. hiệu ứng tương tự như gọi Generator ::send () với NULL làm đối số.
public Generator ::rewind (void) - void - Tua lại trình lặp. Nếu quá trình lặp lại đã bắt đầu, điều này sẽ tạo ra một ngoại lệ.
public Generator ::send (giá trị $ hỗn hợp):hỗn hợp - Gửi giá trị đã cho đến trình tạo do biểu thức năng suất hiện tại và tiếp tục trình tạo.
Trình tạo công cộng ::ném (Ngoại lệ $ có thể ném) - hỗn hợp - Đưa một ngoại lệ vào trình tạo và tiếp tục thực thi trình tạo.
public Generator ::valid (void) - bool - Kiểm tra xem trình lặp đã được đóng lại chưa
public Generator ::__ wakeup (void) - void - Đưa ra một ngoại lệ vì trình tạo không thể được tuần tự hóa.
Lớp Generator triển khai giao diện Iterator. Các đối tượng của trình tạo không thể được khởi tạo thông qua mới. Bất kỳ hàm nào do người dùng xác định có từ khóa lợi nhuận sẽ tạo đối tượng của lớp trình tạo.
Ví dụ về trình tạo
Vì trình tạo triển khai giao diện Iterator, nên mỗi vòng lặp có thể được sử dụng để duyệt qua các giá trị mang lại.
<?php function squaregenerator(){ for ($i=1; $i<=5; $i++){ yield $i*$i; } } $gen=squaregenerator(); foreach ($gen as $val){ echo $val . " "; } ?>
Đầu ra
Chương trình trên hiển thị kết quả sau
1 4 9 16 25
ví dụ sau sử dụng các phương thức current () và next () của lớp trình tạo để truyền các giá trị mang lại. Điều kiện vòng lặp được kiểm tra bằng phương thức 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(); } ?>
Đầu ra
Chương trình trên hiển thị kết quả sau
key: 0 value: 1 key: 1 value: 4 key: 2 value: 9 key: 3 value: 16 key: 4 value: 25