คือ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
เพื่อให้ได้ผลลัพธ์นั้น และถูกต้องคุณ ผลลัพธ์จะเหมือนกัน ความแตกต่างคือวิธีที่เราไปถึงที่นั่น
เมื่อเราใช้range
PHP จะดำเนินการสร้างอาร์เรย์ทั้งหมดของตัวเลขในหน่วยความจำและอาร์เรย์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