ใน PHP เวอร์ชันก่อนหน้า ฟังก์ชัน generator ไม่สามารถคืนค่านิพจน์ได้ แต่ตั้งแต่ PHP 5.5 generator return expression ถูกเพิ่มเข้ามาในที่มีอยู่แล้ว ด้วยการใช้ generator return expressions การใช้คำสั่ง return ภายใน generator จะง่ายขึ้น และยังคืนค่าของนิพจน์สุดท้าย
- ด้วยการใช้ generator return expression เราสามารถคืนค่าของนิพจน์ได้เท่านั้น ไม่สามารถคืนค่า reference ด้วยเมธอดใหม่ Generator::getReturn() เราสามารถดึงค่าที่สามารถใช้ได้หลังจากฟังก์ชัน generator เสร็จสิ้นการ yield ค่าที่กำหนด
- ใช้ PHP 7 generator เราสามารถคืนค่าสุดท้ายจาก generator return expressions ได้ เราสามารถดึง return expression โดยใช้ $generator->getReturn() เพราะ PHP 7 อนุญาตให้ค่าสุดท้ายถูกคืนโดย generator จาก co-routine counting ในโปรแกรมที่อาจถือครองโดย client code ที่ execute generator
Generator Return Expressions: ตัวอย่างที่ 1
<html> <head> <title> PHP 7 Feature : Generator Return Expressions </title> </head> <body> <?php
$generator = (function(){
yield "five";
yield "six";
yield "seven";
return "eight";
})
();
foreach ($generator as $val){
echo $val, PHP_EOL;
}
echo $generator ->getReturn(), PHP_EOL;
?> </body> </html>
ผลลัพธ์
ผลลัพธ์สำหรับโปรแกรม PHP ด้านบนจะเป็น:
five six seven eight
คำอธิบายสำหรับโปรแกรม PHP 7 ด้านบน -
- เราสามารถเขียนโค้ดด้านบนใน editor และเขียน HTML code ที่จำเป็นตามตัวอย่างด้านบน และส่วน body ของ HTML inject โค้ด PHP 7 จริงสำหรับ generator return expression
- ที่สอง ฟังก์ชันที่มี reference เป็น $generator ถูกประกาศ
- ใน reference ของ $generator เรากำหนด yield "five", "six", "seven", และ "eight"
- สุดท้าย เรา iterate บนฟังก์ชัน "$generator" จนจบ (PHP_EOL) และ echo ค่าของ yields พร้อมกับ generator return expression
Generator Return Expressions: ตัวอย่างที่ 2
<html> <head> <title> PHP 7 Feature: Generator Return Expressions Example </title> </head> <body> <?php
function gen(){
yield 'A';
yield 'B';
yield 'C';
return 'gen-return';
}
$generator = gen();
var_dump($generator);
foreach ($generator as $letter){
echo $letter;
}
var_dump($generator->getReturn());
?> </body> </html>
ผลลัพธ์
ผลลัพธ์สำหรับโปรแกรม PHP ด้านบนจะเป็น -
object(Generator)#1 (0) { }ABCstring(10) "gen-return"