คือyieldอะไร
yieldคำหลักข้อมูลผลตอบแทนจากการทำงานเครื่องกำเนิดไฟฟ้า:
หัวใจของฟังก์ชั่นเครื่องกำเนิดไฟฟ้าคือคีย์เวิร์ดผลผลิต ในรูปแบบที่ง่ายที่สุดข้อความสั่ง return ดูเหมือนกับคำสั่ง return ยกเว้นว่าแทนที่จะหยุดการทำงานของฟังก์ชั่นและการกลับมาแทนจะให้ค่าแทนการวนรอบโค้ดเหนือตัวสร้างและหยุดการทำงานของตัวสร้าง
ฟังก์ชั่นเครื่องกำเนิดไฟฟ้าคืออะไร?
ฟังก์ชั่นเครื่องกำเนิดไฟฟ้าได้อย่างมีประสิทธิภาพเป็นวิธีที่มีขนาดกะทัดรัดและมีประสิทธิภาพในการเขียนIterator ช่วยให้คุณกำหนดฟังก์ชั่น (ของคุณxrange) ที่จะคำนวณและส่งกลับค่าในขณะที่คุณวนลูปมัน :
foreach (xrange(1, 10) as $key => $value) {
echo "$key => $value", PHP_EOL;
}
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้:
0 => 1
1 => 2
…
9 => 10
นอกจากนี้คุณยังสามารถควบคุมการ$keyในforeachโดยใช้
yield $someKey => $someValue;
ในการทำงานของเครื่องกำเนิดไฟฟ้า$someKeyเป็นสิ่งที่คุณต้องการสำหรับการปรากฏ$keyและเป็นค่าในการ$someValue $valในตัวอย่างของคำถามนั่นคือ$iในตัวอย่างคำถามที่ว่า
ฟังก์ชั่นปกติต่างกันอย่างไร
ตอนนี้คุณอาจสงสัยว่าทำไมเราไม่เพียงแค่ใช้ฟังก์ชั่นพื้นฐานของ PHPrangeเพื่อให้ได้ผลลัพธ์นั้น และถูกต้องคุณ ผลลัพธ์จะเหมือนกัน ความแตกต่างคือวิธีที่เราไปถึงที่นั่น
เมื่อเราใช้rangePHP จะดำเนินการสร้างอาร์เรย์ทั้งหมดของตัวเลขในหน่วยความจำและอาร์เรย์returnนั้นทั้งหมดไปยังforeachลูปซึ่งจะผ่านมันและส่งออกค่า กล่าวอีกนัยหนึ่งforeachจะทำงานกับอาเรย์เอง rangeฟังก์ชั่นและforeachเพียง "พูดคุย" ครั้งเดียว คิดว่ามันเหมือนได้รับแพคเกจในจดหมาย คนส่งมอบจะมอบแพ็คเกจให้คุณ และจากนั้นคุณก็แกะห่อบรรจุภัณฑ์ทั้งหมดโดยกำจัดสิ่งที่อยู่ในนั้นออก
เมื่อเราใช้ฟังก์ชั่นเครื่องกำเนิดไฟฟ้า PHP จะก้าวเข้าสู่ฟังก์ชั่นและดำเนินการจนกว่าจะเป็นไปตามจุดสิ้นสุดหรือyieldคำหลัก เมื่อตรงกับ a yieldมันจะคืนค่าอะไรก็ตามในเวลานั้นไปยังลูปด้านนอก จากนั้นมันจะกลับไปที่ฟังก์ชันตัวสร้างและดำเนินการต่อจากจุดที่มันให้ เมื่อคุณxrangeถือforลูปมันจะดำเนินการและให้ผลจนกว่าจะ$maxถึง คิดว่ามันเหมือนforeachและเครื่องกำเนิดไฟฟ้าเล่นปิงปอง
ทำไมฉันต้องการมัน
เห็นได้ชัดว่าเครื่องกำเนิดไฟฟ้าสามารถใช้แก้ไขข้อ จำกัด หน่วยความจำ ขึ้นอยู่กับสภาพแวดล้อมของคุณการทำrange(1, 1000000)จะทำให้สคริปต์ของคุณเสียชีวิตในขณะที่ตัวกำเนิดเดียวกันจะทำงานได้ดี หรือตามที่ Wikipedia วางไว้:
เนื่องจากเครื่องกำเนิดไฟฟ้าคำนวณค่าที่ได้รับตามความต้องการเท่านั้นจึงมีประโยชน์สำหรับการแสดงลำดับที่อาจมีราคาแพงหรือไม่สามารถคำนวณได้ในครั้งเดียว เหล่านี้รวมถึงลำดับที่ไม่สิ้นสุดและสตรีมข้อมูลสด
เครื่องกำเนิดไฟฟ้าก็ควรจะค่อนข้างเร็ว แต่โปรดจำไว้ว่าเมื่อเราพูดถึงเรื่องรวดเร็วเรามักจะพูดกันในจำนวนที่น้อยมาก ดังนั้นก่อนที่คุณจะวิ่งออกไปและเปลี่ยนรหัสทั้งหมดของคุณเพื่อใช้เครื่องกำเนิดไฟฟ้าให้ทำเกณฑ์มาตรฐานเพื่อดูว่ามันเหมาะสมหรือไม่
กรณีการใช้งานอื่นสำหรับเครื่องกำเนิดไฟฟ้าคือ coroutines แบบอะซิงโครนัส yieldคำหลักไม่เพียง แต่ค่าตอบแทน แต่ก็ยังยอมรับพวกเขา สำหรับรายละเอียดเกี่ยวกับเรื่องนี้ดูโพสต์บล็อกยอดเยี่ยมทั้งสองลิงค์ด้านล่าง
ตั้งแต่เมื่อไหร่ที่ฉันจะใช้yield?
เครื่องกำเนิดไฟฟ้าได้รับการแนะนำในPHP 5.5 การพยายามใช้yieldก่อนหน้าเวอร์ชันนั้นจะส่งผลให้เกิดข้อผิดพลาดในการแยกวิเคราะห์ต่าง ๆ ขึ้นอยู่กับรหัสที่ตามหลังคำค้นหา ดังนั้นหากคุณได้รับข้อผิดพลาดในการแยกวิเคราะห์รหัสนั้นให้อัปเดต PHP ของคุณ
แหล่งที่มาและอ่านเพิ่มเติม:
yeildพูดจบการแก้ปัญหาเช่นนี้: ideone.com/xgqevM