Là yield
gì
Các yield
từ khóa trở lại dữ liệu từ một chức năng máy phát điện:
Trung tâm của hàm tạo là từ khóa suất. Ở dạng đơn giản nhất, một câu lệnh lợi tức trông giống như một câu lệnh return, ngoại trừ việc thay vì dừng thực thi hàm và trả về, thì thay vào đó, cung cấp một giá trị cho vòng lặp mã trên trình tạo và tạm dừng thực thi hàm tạo.
Hàm tạo là gì?
Hàm tạo là một cách hiệu quả và nhỏ gọn hơn để viết Iterator . Nó cho phép bạn xác định một hàm (của bạn xrange
) sẽ tính toán và trả về các giá trị trong khi bạn đang lặp qua nó :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
Điều này sẽ tạo ra đầu ra sau đây:
0 => 1
1 => 2
…
9 => 10
Bạn cũng có thể kiểm soát $key
trong foreach
bằng cách sử dụng
yield $someKey => $someValue;
Trong hàm tạo, $someKey
là bất cứ thứ gì bạn muốn xuất hiện $key
và $someValue
là giá trị trong $val
. Trong ví dụ của câu hỏi đó $i
.
Sự khác biệt của các chức năng bình thường là gì?
Bây giờ bạn có thể tự hỏi tại sao chúng ta không chỉ đơn giản sử dụng range
hàm riêng của PHP để đạt được đầu ra đó. Và đúng là bạn. Đầu ra sẽ giống nhau. Sự khác biệt là cách chúng tôi đến đó.
Khi chúng tôi sử dụng range
PHP, sẽ thực hiện nó, tạo ra toàn bộ mảng các số trong bộ nhớ và return
rằng toàn bộ mảng với foreach
vòng lặp mà sau đó sẽ đi qua nó và đầu ra các giá trị. Nói cách khác, ý foreach
chí sẽ hoạt động trên chính mảng. Các range
chức năng và foreach
chỉ "nói chuyện" một lần. Hãy nghĩ về nó giống như nhận được một gói trong thư. Người giao hàng sẽ đưa cho bạn gói hàng và rời đi. Và sau đó bạn mở gói toàn bộ, lấy ra bất cứ thứ gì trong đó.
Khi chúng ta sử dụng hàm tạo, PHP sẽ bước vào hàm và thực thi nó cho đến khi nó đáp ứng được kết thúc hoặc một yield
từ khóa. Khi nó gặp a yield
, sau đó nó sẽ trả lại bất cứ giá trị nào tại thời điểm đó cho vòng lặp bên ngoài. Sau đó, nó quay trở lại chức năng máy phát điện và tiếp tục từ nơi nó mang lại. Vì bạn xrange
giữ một for
vòng lặp, nó sẽ thực thi và mang lại cho đến khi $max
đạt được. Hãy nghĩ về nó giống như foreach
và máy phát điện chơi bóng bàn.
Tại sao tôi cần điều đó?
Rõ ràng, máy phát điện có thể được sử dụng để làm việc xung quanh giới hạn bộ nhớ. Tùy thuộc vào môi trường của bạn, việc thực hiện range(1, 1000000)
sẽ gây tử vong cho tập lệnh của bạn trong khi tương tự với trình tạo sẽ hoạt động tốt. Hoặc như Wikipedia đặt nó:
Bởi vì các máy phát điện chỉ tính toán các giá trị mang lại của chúng theo yêu cầu, chúng rất hữu ích trong việc biểu diễn các chuỗi sẽ tốn kém hoặc không thể tính toán cùng một lúc. Chúng bao gồm ví dụ như chuỗi vô hạn và luồng dữ liệu trực tiếp.
Máy phát điện cũng được cho là khá nhanh. Nhưng hãy nhớ rằng khi chúng ta nói về nhanh, chúng ta thường nói với số lượng rất nhỏ. Vì vậy, trước khi bạn chạy đi và thay đổi tất cả mã của bạn để sử dụng các trình tạo, hãy làm một điểm chuẩn để xem nó có ý nghĩa như thế nào.
Trường hợp sử dụng khác cho Máy phát điện là coroutines không đồng bộ. Các yield
từ khóa không chỉ trả lại giá trị nhưng nó cũng chấp nhận chúng. Để biết chi tiết về điều này, xem hai bài viết blog tuyệt vời được liên kết dưới đây.
Từ khi nào tôi có thể sử dụng yield
?
Các trình tạo đã được giới thiệu trong PHP 5.5 . Cố gắng sử dụng yield
trước phiên bản đó sẽ dẫn đến các lỗi phân tích khác nhau, tùy thuộc vào mã theo từ khóa. Vì vậy, nếu bạn gặp lỗi phân tích cú pháp từ mã đó, hãy cập nhật PHP của bạn.
Nguồn và đọc thêm:
yeild
nó đã qua, giả sử, một giải pháp như thế này: ideone.com/xgqevM