แนะนำตัว
สำรวจชุดข้อมูลขนาดใหญ่โดยใช้โครงสร้างการวนซ้ำ เช่น foreach จะต้องใช้หน่วยความจำขนาดใหญ่และใช้เวลาในการประมวลผลมาก ด้วย เครื่องกำเนิดไฟฟ้า เป็นไปได้ที่จะวนซ้ำชุดข้อมูลโดยไม่มีค่าโสหุ้ยเหล่านี้ ฟังก์ชันเครื่องกำเนิดไฟฟ้าจะคล้ายกับฟังก์ชันปกติ อย่างไรก็ตาม แทนที่จะส่งคืนคำสั่งในฟังก์ชัน ตัวสร้างจะใช้ ผลตอบแทน คำหลักที่จะดำเนินการซ้ำ ๆ เพื่อให้มีค่าที่จะทำซ้ำ
คำหลักผลตอบแทนเป็นหัวใจของกลไกการกำเนิด แม้ว่าการใช้งานจะคล้ายกับการส่งคืน แต่ก็ไม่ได้หยุดการทำงานของฟังก์ชัน มีค่าถัดไปสำหรับการวนซ้ำและหยุดการทำงานของฟังก์ชันชั่วคราว
ไวยากรณ์
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 }
วิธีการ
ตัวสร้างสาธารณะ::กระแส ( โมฆะ ) - ผสม — รับค่าผลตอบแทน
ตัวสร้างสาธารณะ::getReturn ( เป็นโมฆะ ) :ผสม — รับผลตอบแทนของเครื่องกำเนิดไฟฟ้า
ตัวสร้างสาธารณะ::คีย์ ( โมฆะ ) - ผสม — รับคีย์ของค่าที่ได้
ตัวสร้างสาธารณะ::ถัดไป ( โมฆะ ) − โมฆะ — ดำเนินการต่อไปของเครื่องกำเนิด ผลเช่นเดียวกับการเรียก Generator::send() โดยมี NULL เป็นอาร์กิวเมนต์
ตัวสร้างสาธารณะ::ย้อนกลับ ( โมฆะ ) − โมฆะ — กรอกลับตัววนซ้ำ หากการทำซ้ำได้เริ่มต้นขึ้นแล้ว การดำเนินการนี้จะทำให้เกิดข้อยกเว้น
ตัวสร้างสาธารณะ::ส่ง ( ค่า $ ผสม ) :ผสม — ส่งค่าที่กำหนดไปยังตัวสร้างซึ่งเป็นผลมาจากการแสดงออกของผลตอบแทนปัจจุบันและตัวสร้างต่อ
ตัวสร้างสาธารณะ::โยน ( ยกเว้น $ ที่โยนได้ ) - ผสม — โยนข้อยกเว้นเข้าไปในตัวสร้างและดำเนินการกับตัวสร้างต่อ
ตัวสร้างสาธารณะ::ถูกต้อง ( เป็นโมฆะ ) − บูล — ตรวจสอบว่าตัววนซ้ำถูกปิดหรือไม่
เครื่องมือสร้างสาธารณะ::__wakeup ( โมฆะ ) − โมฆะ — มีข้อยกเว้นเนื่องจากเครื่องกำเนิดไฟฟ้าไม่สามารถจัดลำดับได้
คลาสตัวสร้างใช้อินเทอร์เฟซ Iterator วัตถุตัวสร้างไม่สามารถสร้างอินสแตนซ์ใหม่ได้ ฟังก์ชันที่ผู้ใช้กำหนดซึ่งมีคีย์เวิร์ดให้ผลตอบแทนจะสร้างวัตถุของคลาสตัวสร้าง
ตัวอย่างเครื่องกำเนิดไฟฟ้า
เนื่องจากตัวสร้างใช้อินเทอร์เฟซ Iterator สำหรับแต่ละลูปจึงสามารถใช้เพื่อสำรวจค่าที่ได้
<?php function squaregenerator(){ for ($i=1; $i<=5; $i++){ yield $i*$i; } } $gen=squaregenerator(); foreach ($gen as $val){ echo $val . " "; } ?>
ผลลัพธ์
โปรแกรมด้านบนแสดงผลลัพธ์ต่อไปนี้
1 4 9 16 25
ตัวอย่างต่อไปนี้ใช้เมธอด current() และ next() ของคลาสตัวสร้างเพื่อสำรวจค่าที่ได้ ตรวจสอบเงื่อนไขลูปด้วยเมธอด valid()
ตัวอย่าง
<?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(); } ?>
ผลลัพธ์
โปรแกรมด้านบนแสดงผลดังต่อไปนี้
key: 0 value: 1 key: 1 value: 4 key: 2 value: 9 key: 3 value: 16 key: 4 value: 25