🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ علی
generator functions
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۲۴ آذر ۱۴۰۰

سلام یکی از مورادی که هنگام loop زدن روی حجم زیادی از داده‌ها باعث کاهش مصرف memory میشه استفاده از generatorهاست می‌خوام بدونم PHP در پس زمینه چطور با generator functionها برخورد می‌کنه؟!

کد زیر رو نگاه کنید :

function x()
{
    echo 'Ali';
    yield 'a';
    yield 'b';
};

وقتی من تابع x رو فراخوانی میکنم بدنه تابع اجرا نمیشه و چیزی تو خروجی echo نمیشه و در عوض یک شی generator برمی گردونه. حالا با استفاده از شی generator می‌تونیم تیکه اول تابع (یعنی از ابتدا تا yield اول) رو اجرا کنیم

$generator = x();
$generator->current();
// Ali

این مثال نشون میده که با این توابع یطور دیگه رفتار میشه

این تیکه تیکه اجرا شدن تابع ، ذخیره کردن state فعلی و... رو شی generator مدیریت میکنه؟ life cycle این generatorها چه شکلیه؟

سلام.

علت این اختلاف سرعت و بهینگی حافظه اینجاست که وقتی شما یک داده ی بزرگ رو پیمایش میکنید مثل range(0, 1000000) آرایه ی ساخته شده روی حافظه نگه داشته میشه و تا آخر Loop روی مموری وجود داره بنابراین مصرف حافظه رو میبره بالا در بعضی کدها هم اگر مقدار حافظه بیشتر از memory_limit تعیین شده باشه منجر به خطا میشود.


اما Generator که با yield پیاده میشه(به تعبیر داک php.net قلب جنریتور) متفاوت عمل میکنه. yield مثل return عمل میکنه.

تفاوتشون اینه که return فقط یک value برمیگردونه ولی yield برخلاف return این عمل برگرداندن value به Loop رو مدام انجام میده و جنریتور متوقف نمیشه.

نکته ای که هست جنریتور زمانی استفاده میشه مجموعه داده ی شما حجم بالایی داشته باشه.

محسن موحد ۲۴ آذر ۱۴۰۰، ۱۲:۴۹