TGViewer
| کانال توسعه‌دهندگان PHP | | کانال توسعه‌دهندگان PHP | @developixphp · 1.68K subscribers
Post #53 1.53K
معرفی yield - قسمت دوم

در قسمت اول با مفهوم و کاربرد yield آشنا شده ایم، در این قسمت به طور کامل با انواع روش های استفاده از آن آشنا می شویم.

ابتدا به معرفی متد های تعامل با Generator ها آشنا می شویم:

1- متد key
کلید (index) فعلی Generator را برمی‌گرداند.
function gen() {
yield 'a';
yield 'b';
}

$generator = gen();
echo $generator->key(); // 0


2- متد 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")); // Error


8- متد 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 2


2- بازگشت مقدار به همراه کلید:
در حالت معمولی، 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
  • ❤ 4
  • 👍 3
More from @developixphp
  1. Sep 26, 2026این کد موقع اجرا چه خروجی‌ای می‌ده و مشکلش کجاست؟ 🔖 #PHP #پی_اچ_پی 👤 Developix 💎 Channe…
  2. Sep 25, 2026🔥 پکیج: قراردادهای ترجمه سیمفونی اگر کد PHP را برای چندزبانگی می‌نویسید، بهتر است منطق بر…
  3. Sep 16, 2026🚀 &rlm;LaraGram Brain منتشر شد! از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraG…
  4. Sep 11, 2026ارسال ایمیل تأیید ثبت‌نام، بازیابی رمز عبور یا نوتیفیکیشن سفارش، تقریباً توی هر پروژه‌ PHP…
  5. Sep 10, 2026برنامه نویسی سوکت در PHP بخش اول عبارت دیگر در ارتباط های غیر سوکت برای ارسال یک پالس از س…
  6. Aug 31, 2026🔥 پکیج: استاندارد PSR-11 برای Container استاندارد PSR-11 فقط یه interface مشترک برای Cont…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →