Trưa nay, khi đang đọc, tôi chợt biết rằng PHP cũng có các trình tạo như Python. tôi đã rất ngạc nhiên. Gì? . 😲
Chà, sau đó tôi bắt đầu đọc về máy phát điện và đây là những gì tôi biết về nó
máy phát điện
Trình tạo giống như các hàm nhưng điểm khác biệt chính giữa chúng là hàm trả về giá trị (hoặc có thể không) nhưng trình tạo mang lại giá trị. Có, trình tạo cũng có thể trả về giá trị. Chúng ta sẽ đi sâu vào vấn đề đó sau. Hàm chứa từ khóa *yield* là một trình tạo. Đó là nó
Khi bạn cố ý hoặc vô ý sử dụng từ khóa yield trong một hàm, hàm đó sẽ trở thành một trình tạo. Không thể vô tình, vì bạn có thể không biết từ. Bạn sẽ sử dụng như thế nào?
Chúng ta hãy xem mã…
function g1 () {yield 1;
yield 2;
yield 3;
}
Đoạn mã trên là một trình tạo. Khi bạn lặp lại hàm, mỗi lần bạn sẽ nhận được một giá trị cho đến khi kết thúc
$gen = g1();foreach($gen as $value) {echo $value . PHP_EOL;
}
Trong khi lặp lại trình tạo, bạn cũng sẽ nhận được một khóa cho các giá trị đó. Vì vậy, lần lặp trước có thể được viết lại như sau
$gen = g1();foreach($gen as $key => $value) {echo $key . ' => ' . $value . PHP_EOL;
}
Trình tạo cũng có thể được sử dụng như một mảng kết hợp. Bạn chỉ có thể làm như sau để đạt được như vậy,
function g2 () {yield 'a' => 1;
yield 'b' => 2;
yield 'c' => 3;
}$gen = g2();foreach($gen as $key => $value) {
echo $key . ' => ' . $value . PHP_EOL;
}
Nếu bạn đang sử dụng PHP5 và bạn muốn sử dụng kết quả như một biểu thức và sử dụng biến đó sau đó, bạn nên đặt câu lệnh kết quả trong dấu ngoặc đơn. Thích $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}9. Trong PHP7+ sẽ tốt nếu bạn không sử dụng dấu ngoặc đơn
Bạn cũng có thể tạo ra NULL từ trình tạo bằng $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}0 hoặc $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}1
yield null;
yield;
}$gen = gnull();foreach($gen as $key => $value) {
echo $key . ' => ' . $value . PHP_EOL;
}
Ủy quyền máy phát điện
Bạn chỉ có thể ủy quyền các giá trị của trình tạo chỉ trong PHP7+. Cái nào có thể được ủy quyền từ một trình tạo khác, đối tượng có thể duyệt hoặc một mảng. Để đạt được như vậy, bạn có thể làm như dưới đây
function gDelegate () {yield from g2();
yield from [3, 4];
yield from new ArrayIterator([5, 6]);
yield 'd' => 4;
yield 'e' => 5;
yield 'f' => 6;
}$gen = gDelegate();
foreach($gen as $key => $value) {
echo $key . ' => ' . $value . PHP_EOL;
}
Giá trị trả về
Chỉ trong PHP7+, bạn mới được phép trả về giá trị từ trình tạo. Làm như vậy trong phiên bản trước sẽ gây ra lỗi
Trong PHP 5, trình tạo không thể trả về giá trị. làm như vậy sẽ dẫn đến lỗi biên dịch. — php. net
Để lấy giá trị trả về từ trình tạo, chúng tôi sẽ sử dụng phương thức $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}2
yield 'a' => 1;
yield 'b' => 2; return 'greturn';
}$gen = greturn();
foreach($gen as $key => $value) {
echo $key . ' => ' . $value . PHP_EOL;
}var_dump($gen->getReturn());
Phương thức $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}3 trên trình tạo sẽ trả về giá trị được trả về từ trình tạo
Chuyển đổi thành một mảng
Trình tạo là một mục có thể lặp lại. Để chuyển đổi một trình tạo thành một mảng, chúng ta sẽ sử dụng phương thức $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}4
echo $value . PHP_EOL;
}2
Nhưng vấn đề với điều này là mỗi trình tạo tạo một khóa cho các giá trị của nó. Nếu khóa không được chỉ định, nó sẽ bắt đầu từ $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}5. Bây giờ trong khi chuyển đổi thành một mảng, nếu bạn muốn ủy quyền các giá trị từ các đối tượng có thể lặp lại khác, các khóa sẽ bị ghi đè nếu có cùng một khóa cho nhiều giá trị. Kiểm tra mã sau…
echo $value . PHP_EOL;
}4
đầu ra iterate_to_array
Như bạn có thể thấy ở trên, giá trị của khóa $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}6 đã bị ghi đè tại đây. Nếu bạn đang sử dụng khóa dựa trên $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}7 và chỉ mục không quan trọng với bạn thì bạn có thể chuyển tham số thứ hai $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}8 cho $gen = g1();foreach($gen as $value) {
echo $value . PHP_EOL;
}4, tham số này sẽ lập chỉ mục lại mảng và giữ tất cả các giá trị. Làm như vậy để các trình tạo Giá trị khóa sẽ lập chỉ mục lại bằng các khóa số nguyên