ভূমিকা
বড় ডেটা কালেকশন foreach লুপ দিয়ে ট্রভার্স করলে বড় মেমরি এবং প্রসেসিং টাইম লাগে। জেনারেটর দিয়ে এই ওভারহেড ছাড়া ডেটার সেট ওভার ইটারেট করা যায়। একটি জেনারেটর ফাংশন নরমাল ফাংশনের মতো। তবে, ফাংশনে return স্টেটমেন্টের বদলে জেনারেটর yield কিওয়ার্ড ব্যবহার করে যাতে এটি বারবার এক্সিকিউট হয় এবং ইটারেট করার জন্য মান প্রদান করে।
yield কিওয়ার্ড জেনারেটর মেকানিজমের হৃদয়। এর ব্যবহার return-এর মতো লাগে, কিন্তু এটি ফাংশন এক্সিকিউশন থামায় না। এটি ইটারেশনের জন্য পরের মান প্রদান করে এবং ফাংশন এক্সিকিউশন পজ করিয়ে রাখে।
সিনট্যাক্স
Generator implements Iterator { 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 }মেথড
public Generator::current ( void ) — mixed — ইয়িল্ডেড মান পান
public Generator::getReturn ( void ) : mixed — জেনারেটরের রিটার্ন ভ্যালু পান
public Generator::key ( void ) — mixed — ইয়িল্ডেড মানটির কি পান
public Generator::next ( void ) — void — জেনারেটরের এক্সিকিউশন রিজিউম করুন। Generator::send() কাল করার সমান NULL আর্গুমেন্ট দিয়ে।
public Generator::rewind ( void ) — void — ইটারেটর রিউইন্ড করুন। যদি ইটারেশন ইতিমধ্যে শুরু হয়ে গেছে, এটি এক্সসেপশন থ্রো করবে।
public Generator::send ( mixed $value ) : mixed — দেয়া মানটি জেনারেটরে পাঠান বর্তমান yield এক্সপ্রেশনের রেজাল্ট হিসেবে এবং জেনারেটর রিজিউম করুন।
public Generator::throw ( Throwable $exception ) — mixed — জেনারেটরে এক্সসেপশন থ্রো করুন এবং জেনারেটরের এক্সিকিউশন রিজিউম করুন।
public Generator::valid ( void ) — bool — ইটারেটর বন্ধ হয়েছে কিনা চেক করুন
public Generator::__wakeup ( void ) — void — এক্সসেপশন থ্রো করে কারণ জেনারেটর সিরিয়ালাইজ করা যায় না।
Generator ক্লাস Iterator ইন্টারফেস ইমপ্লিমেন্ট করে। Generator অবজেক্ট new দিয়ে ইনস্ট্যানশিয়েট করা যায় না। yield কিওয়ার্ড থাকা যেকোনো ইউজার-ডিফাইনড ফাংশন Generator ক্লাসের অবজেক্ট তৈরি করে।
Generator উদাহরণ
যেহেতু Generator Iterator ইন্টারফেস ইমপ্লিমেন্ট করে, foreach লুপ ব্যবহার করে ইয়িল্ডেড মানগুলো ট্রভার্স করা যায়।
<?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