در قسمت اول با مفهوم و کاربرد yield آشنا شده ایم، در این قسمت به طور کامل با انواع روش های استفاده از آن آشنا می شویم.
ابتدا به معرفی متد های تعامل با Generator ها آشنا می شویم:
1- متد key
کلید (index) فعلی Generator را برمیگرداند.
function gen() {
yield 'a';
yield 'b';
}
$generator = gen();
echo $generator->key(); // 02- متد current
مقدار فعلی را برمیگرداند.
echo $generator->current(); // a
3- متد next
Generator را به مقدار بعدی منتقل میکند.
$generator->next();
echo $generator->current(); // b
4- متد rewind
Generator را به ابتدای لیست برمیگرداند. فقط در صورت عدم اجرای کامل Generator کار میکند.
$generator->rewind();
echo $generator->current(); // a
5- متد valid
بررسی میکند که آیا مقدار فعلی معتبر است یا خیر.
if ($generator->valid()) {
echo "Valid";
}6- متد send
مقداری را به Generator ارسال میکند (برای کار با Generators تعاملی مفید است).
function interactive() {
$value = yield;
echo "Received: $value\n";
}
$generator = interactive();
$generator->send('Hello!'); // Received: Hello!7- متد throw
یک استثنا به Generator ارسال میکند.
function gen() {
try {
yield 1;
} catch (Exception $e) {
echo $e->getMessage();
}
}
$generator = gen();
$generator->throw(new Exception("Error")); // Error8- متد getReturn
مقدار بازگشتی تابع Generator را (در صورتی که وجود داشته باشد) برمیگرداند. از PHP 7.0 اضافه شده است.
function gen() {
yield 1;
return 42;
}
$generator = gen();
foreach ($generator as $value) {
echo $value . "\n"; // 1
}
echo $generator->getReturn(); // 42در ادامه به حالت های استفاده از yield خواهیم پرداخت:
1- حالت بازگشت مقدار ساده:
در سادهترین حالت، yield مقداری را برمیگرداند که میتوان در یک حلقه به آن دسترسی داشت.
function simpleYield() {
yield 1;
yield 2;
}
foreach (simpleYield() as $value) {
echo $value . " ";
}
// Output: 1 22- بازگشت مقدار به همراه کلید:
در حالت معمولی، yield یک مقدار را تولید میکند. اما میتوان یک کلید نیز همراه با مقدار تولید کرد.
function keyValueYield() {
yield "a" => 1;
yield "b" => 2;
}
foreach (keyValueYield() as $key => $value) {
echo "$key: $value, ";
}
// Output: a: 1, b: 2,3- Yield ترکیبی با ارسال و دریافت مقادیر (send)
میتوانید مقادیر را به generator ارسال کنید و نتیجه را دریافت کنید.
مثال این مورد برای متد شماره 6 در ابتدای پست آورده شده.
4- Yield همراه با Exception Handling
با استفاده از متد throw میتوان یک استثنا به Generator ارسال کرد.
مثال این مورد برای متد شماره 7 در ابتدای پست آورده شده.
5- Yield مقادیر از منابع خارجی (با استفاده از yield from)
yield from برای تولید مقادیر از یک منبع دیگر، مانند یک آرایه یا یک Generator داخلی، استفاده میشود.
این منبع میتواند یک آرایه یا یک Generator باشد.
Yield from یک آرایه
function arrayYield() {
yield from [1, 2, 3];
}
foreach (arrayYield() as $value) {
echo $value . " "; // 1 2 3
}Yield from یک Generator
function subGenerator() {
yield 1;
yield 2;
}
function mainGenerator() {
yield from subGenerator();
yield 3;
}
foreach (mainGenerator() as $value) {
echo $value . " "; // 1 2 3
}6- بازگشت مقدار نهایی
میتوان مقدار نهایی تولید شده توسط Generator را پس از تکمیل، از طریق متد getReturn دریافت کرد.
مثال این مورد برای متد شماره 8 در ابتدای پست آورده شده.
7- Yield بدون مقدار
اگر yield بدون مقدار استفاده شود، مقدار پیشفرض null بازمیگرداند.
function nullYield() {
yield;
yield 2;
}
foreach (nullYield() as $value) {
var_dump($value); // NULL 2
}8- Yield با Closureها
میتوان yield را همراه با Closure استفاده کرد تا مقادیر داینامیک ایجاد شوند.
function closureYield($callback) {
for ($i = 0; $i < 3; $i++) {
yield $callback($i);
}
}
$generator = closureYield(function ($n) {
return $n * 2;
});
foreach ($generator as $value) {
echo $value . " "; // 0 2 4
}9- Yield با Reference
Yield با Reference این امکان را میدهد که مقدار بازگرداندهشده از Generator مستقیماً قابل تغییر باشد.
function &gen_reference() {
$value = 3;
while ($value > 0) {
yield $value;
}
}
foreach (gen_reference() as &$num) {
echo --$num . ' '; // 2 1 0
}🔖 #PHP, #پی_اچ_پی
👤 AmirHossein
💎 Channel: @DevelopixPHP