آیا در مورد yield در PHP چیزی شنیدید؟ خب من در وقتتون صرفه جویی میکنم و نیازی نیست برید سرچ کنید با سرفصل زیر در مورد yield صحبت می کنیم
بزارید یه تابع تعریف کنیم مثل بقیه توابع ولی به جای return کردن yield میکنیم مانند:
function getValues() { yield 'value'; } // print the string "value" echo getValues();
خب مسلماَ، این کد کار نمی کنه به شما یه fetal error بر میگردونه:
object of class Generator could not be converted to string
بزارید ارور رو توضیح بدیم:
اروری که بالا نوشتم میگه تابعمون string باید return میکرده ولی یه object فرستاده!!! اگه بخوایم تایپ شون رو بفهمیم:
function getValues() { return 'value'; } var_dump(getValues()); // string(5) "value" function getValues() { yield 'value'; } var_dump(getValues()); // class Generator#1 (0)
کلاس Generator یه کلاسی هست که implement میشه از اینترفیس Iterator: یعنی باید از تابع getValues در حلقه ها استفاده کنیم:
foreach (getValues() as $value) { echo $value; } // using variable is also alright $values = getValues(); foreach ($values as $value) { echo $value; }
البته این تنها تفاوتش نیست
یه Generator بهت اجازه میده از حلقه ها برای یه دسته از داده ها استفاده کنی بدون اینکه آرایه ای تعریف کنی و این یعنی آرایه ای نیست که در رم ذخیره کنه و در نتیجه مصرف رم کمتر!
برای درک بهتر استفاده از yield فکر کنید یه آرایه داریم با 800,000 ایندکس و بخوایم با تابعی مثل تابع بالا return کنیم و اگر با تابع memory_get_usage() میزان رم را اندازه گیری کنیم، من در هر 200,000 المنت اندازه گیری کردم و نتیجه اش:
0.34MB 8.35MB 16.35MB 32.30MB
خب بخاطر چند تا خط کد، اسکریپتمون بخواد 30 مگ حافظه مموری رو اشغال کنه یعنی هر بار صدا کردن آرایه این مقدار در مموری افزایش پیدا میکنه اما اگه از yield برای همین مثال استفاده کنیم
نتیجه:
0.34MB 0.34MB 0.34MB 0.34MB
متوجه تفاوت فاحش این دو کد میشید اما این به این معنی نیست که از return به yield مهاجرت کنیم اما اگه از یه آرایه سنگین در کدتون استفاده می کنید گزینه مناسب همین yield خواهد بود
من یه چندتا از خصوصیات yield رو اینجا براتون میگم(مهماش!)
آ. می تونید yield و return رو باهم استفاده کنید:
function getValues() { yield 'value'; return 'return value'; } $values = getValues(); foreach($values as $value) {} echo $values->getReturn();// 'retrun value'
ب. برگرداندن به حالت key/value
function getValues() { yield 'key' => 'value'; } $values = getValues(); foreach($values as $key => $value) {}
اطلاعات بیشتر در اینجا
هدف این مقاله بیان تفاوت بین yield و retrun بود و زدن چند تا مثال برای درک بهتر yield
امیدوارم بدردتون خورده باشه
لطفا در مورد اولین مطلب نظراتتون رو بدید و اگر عنوان یا مبحثی مد نظرتون پیشنهاد دهید
یا حق