سلام.
زمان کامپایل(تفسیر) برنامه، کدهای PHP به opcode تبدیل میشن و درنهایت این زبان میانی(opcode) تبدیل به کدماشین میشن.
پس کافیه ببینیم، که الگوریتم های for و while از دید مفسر PHP چگونه تفسیر میشن.
الگوریتم for:
<?php
for ($i = 0; $i < 10; $i++) {
echo $i . PHP_EOL;
}
کد بالا تبدیل به opcode شده و به شکل زیر تبدیل میشه:
number of ops: 9
compiled vars: !0 = $i
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, 0
1 > JMP ->6
3 2 > CONCAT ~2 !0, '%0A'
3 ECHO ~2
2 4 POST_INC ~3 !0
5 FREE ~3
6 > IS_SMALLER_OR_EQUAL ~4 !0, 10
7 > JMPNZ ~4, ->2
4 8 > > RETURN 1
حالا الگوریتم while:
<?php
$i = 0;
while ($i < 10) {
echo $i . PHP_EOL;
$i++;
}
opcode های کد بالا:
number of ops: 9
compiled vars: !0 = $i
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ASSIGN !0, 0
3 1 > JMP ->6
4 2 > CONCAT ~2 !0, '%0A'
3 ECHO ~2
5 4 POST_INC ~3 !0
5 FREE ~3
3 6 > IS_SMALLER_OR_EQUAL ~4 !0, 10
7 > JMPNZ ~4, ->2
6 8 > > RETURN 1
اگر به opcode های ساخته شده ی دو الگوریتم نگاه کنید، میبینید که از نظر مفسر هر دو الگوریتم به یک شکل دیده شده. بنابراین تفاوت خاصی بین دو الگوریتم وجود نداره و اگر هم گاها تفاوتی ایجاد بشه(بخاطر شرایط سرور) بسیار ناچیز و در حد هزارم ثانیه هست و قابل چشم پوشی است.(تایم اجرای دو کد رو گرفتم)
در گوگل هم میتونید سرچ بزنید در موردش بحث شده.
پ.ن: بدنیست شماره ی لاین هم به syntax highlighter اضافه بشه.
البته استاد در هنگام تدریس فرمودند که سرعت پردازش در for each بیشتر هست