yield در واقع مقداری را به Caller (تابعی که جنراتور را فراخوانی میکند) بازمیگرداند، اما در عین حال حالت فعلی جنراتور را نیز ذخیره میکند تا بتوان بعداً از همان نقطه ادامه داد. این تفاوت اصلی بین yield و return است؛ return کارکرد تابع را به طور کامل پایان میدهد، در حالی که yield این امکان را میدهد که تابع بعداً از همان نقطه توقف اجرا شود.
مثال :
فرض کنید که ما یک فایل بزرگ لاگ داریم که میخواهیم هر خط آن را بخوانیم و بررسی کنیم. به جای خواندن کامل فایل در حافظه، میتوانیم از جنراتور برای خواندن خط به خط استفاده کنیم تا مصرف حافظه را کاهش دهیم.
function readLargeFile($filename) {
$handle = fopen($filename, "r");
while (!feof($handle)) {
yield fgets($handle);
}
fclose($handle);
}
foreach (readLargeFile("large_log_file.txt") as $line) {
echo $line . "<br>";
}در این مثال، تابع readLargeFile به عنوان یک جنراتور عمل میکند. این تابع ابتدا فایل مورد نظر را برای خواندن باز میکند. درون حلقه while، از fgets برای خواندن هر خط از فایل استفاده میکنیم. تابع fgets خط بعدی را از فایل میخواند، و با استفاده از yield، این خط را به کد خارج از تابع برمیگرداند.
با استفاده از حلقه foreach، ما میتوانیم هر خطی که جنراتور readLargeFile باز میگرداند را استفاده کنیم. این اجازه میدهد که هر خط را بلافاصله پردازش کنیم بدون اینکه نیاز باشد کل فایل در حافظه بارگذاری شود. این روش بسیار مؤثری برای کار با فایلهای بزرگ است، زیرا فقط بخشی از فایل که در حال پردازش است در حافظه نگه داشته میشود، و بنابراین مصرف حافظه به شدت کاهش مییابد.
این رویکرد خصوصاً در مواقعی مفید است که با دادههایی کار میکنیم که بسیار بزرگتر از حافظه موجود هستند یا وقتی که میخواهیم اطمینان حاصل کنیم که برنامهی ما بهینه و کارآمد باقی میماند حتی در مواجهه با حجم زیادی از دادهها.
👤 AmirHossein
💎 Channel: @DevelopixPHP