do while ورژنی از همان حلقهٔ while است که در آموزش گذشته با آن آشنا شدیم با این تفاوت که شرط مرتبط با حلقه پس از اینکه حداقل یک بار بلوک کد اجرا شد، بررسی میگردد. به عبارت دیگر، در مواقعی کاربرد دارد که بخواهیم اسکریپتی را حداقل یک بار اجرا کرده سپس با چک کردن شرط، در مورد تکرار مجدد اسکریپت و یا خارج شدن از حلقه تصمیم بگیریم. ساختار کلی این حلقه عبارت است از:
do {
// This code is run at least once
} while (condition)
// This code is run after the loop finishes
در واقع، مفسر PHP ابتدا کدهای قرار گرفته داخل { } را اجرا کرده سپس Condition یا شرط را مورد بررسی قرار میدهد؛ چنانچه این شرط برقرار بود، کدهای مد نظر مجدد اجرا میشوند و در غیر این صورت، اسکریپت متوقف خواهد شد. چنانچه بخواهیم این پروسه را به شکل بصری ترسیم کنیم، فلوچارت زیر را خواهیم داشت:
سناریوی فرضی سرویس بهداشتی برای درک بهتر کاربرد این حلقه
اگر بخواهیم کاربرد do while را با مثالی از دنیای واقعی مقایسه کنیم، میتوان سناریویی فرضی را متصور شد که در آن قصد استفاده از سرویس بهداشتی عمومی را داریم!
do {
lockTheDoor();
} while ($peeing);
فرض کنیم که در مکانی عمومی قصد استفاده از سرویس بهداشتی را داریم که در چنین موقعیتی، منطق حکم میکند پیش از آنکه کار خود را شروع کنیم! از قفل بودن درب سرویس اطمینان حاصل کنیم. لذا همانطور که در کد فوق میبینیم، داخل بلوک { } ابتدا فانکشنی تحت عنوان ()lockTheDoor به معنی تحتالفظی «در را قفل کن» را فراخوانی کردهایم (به عبارت دیگر، پیش از هر چیز چک میکنیم ببنیم که آیا درب قبل است یا خیر.) در ادامه، مادامی که شرط در نظر گرفته شده برای while برقرار باشد، در قفل خواهد ماند؛ یعنی مادامی که مشغول Pee (دستشویی کردن) باشید، درب دستشویی کماکان قفل خواهد ماند.
ساخت گیم حدس عدد با استفاده از do while
به منظور درک بهتر عملکرد این نوع از حلقهها در زبان PHP، در ادامه حلقهٔ do while را در قالب یک گیم مورد استفاده قرار خواهیم داد:
$theNumber = rand(1, 10);
echo "The number is $theNumber<br>";
do {
$myGuess = rand(1, 10);
echo "I`m guessing: $myGuess</br>";
} while ($myGuess != $theNumber);
echo "I got it! It`s $myGuess!<br>";
ابتدا به تفسیر کدهای فوق پرداخته، سپس چند بار آن را تست میکنیم تا خروجی را مشاهده نماییم. ابتدا متغیری تحت عنوان theNumber$ تعریف کردهایم که مقدار اولیهاش عددی تصادفی است که با استفاده از تابع به اصطلاح Built-in (از پیش تعریف شده) در زبان PHP تحت عنوان ()rand تعیین میگردد که این عدد تصادفی در بازهٔ ۱ تا ۱۰ انتخاب خواهد شد و سپس با استفاده از دستور echo این عدد را چاپ میکنیم.
حال میرسیم به کدهای قرار گرفته داخل { } که بدون اینکه ابتدا به ساکن شرط این حلقه چک شود و از True بودن آن اطمینان حاصل گردد، حداقل یک بار اجرا خواهد شد و آن هم چیزی نیست جز ساخت متغیری دیگر تحت عنوان myGuess$ که این متغیر هم دقیقاً همچون متغیر theNumber$ مقداردهی میشود؛ به عبارتی، یک عدد رَندوم (تصادفی) در بازهٔ ۱ تا ۱۰ برایش در نظر گرفته خواهد شد. در ادامه، استرینگی روی صفحه چاپ میکنیم با این مضمون که «عددی که حدس میزنم برابر است با ...» و ... را با مقدار متغیر myGuess$ جایگزین میکنیم.
در شرط قرار گرفته داخل پرانتزهای مرتبط با while گفتهایم اگر مقدار متغیرهای myGuess$ و theNumber$ با هم نامساوی بود، اجرای اسکریپتها ادامه یابد تا زمانی که هر دو عدد مساوی شوند که در این صورت از حلقه خارج شده و در نهایت با استفاده از دستور echo عددی که درست حدس زده بودیم را چاپ خواهیم کرد. حال یک بار این اسکریپت را در لوکالهاست اجرا میکنیم:
The number is 8
I`m guessing: 10
I`m guessing: 2
I`m guessing: 7
I`m guessing: 2
I`m guessing: 1
I`m guessing: 8
I got it! It`s 8!
اکنون برای بار دوم دست به اجرای کد میزنیم:
The number is 7
I`m guessing: 8
I`m guessing: 10
I`m guessing: 3
I`m guessing: 9
I`m guessing: 8
I`m guessing: 3
I`m guessing: 3
I`m guessing: 8
I`m guessing: 6
I`m guessing: 7
I got it! It`s 7!
حال برای سومین بار این اسکریپت را اجرا میکنیم:
The number is 10
I`m guessing: 10
I got it! It`s 10!
دو بار اولی که کد را اجرا کردیم، عددی که ابتدا حدس زده بودیم درست نبود؛ لذا این حلقه آنقدر ادامه یافت تا به عدد درست دست پیدا کردیم اما در اجرای سوم، همانطور که ملاحظه میشود، عدد رَندوم انتخابی سیستم برابر با ۱۰ بود و این عدد در خروجی چاپ شد؛ سپس وارد بلوک { } شده و یک عدد تصادفی به متغیر myGuess$ اختصاص یافته که از قضا این عدد هم برابر با ۱۰ بود و در خروجی چاپ شد. حال میرسیم به شرط قرار گرفته داخل پرانتزهای مرتبط با while و از آنجا که هر دو متغیر myGuess$ و theNumber$ با یکدیگر مساوی هستند (به عبارتی شرط False است)، لذا از حلقه خارج شده و در نهایت استرینگ قرار گرفته مقابل دستور echo در خط هفتم اجرا میگردد.