while (condition) { ... } מריצה את הבלוק שוב ושוב כל עוד התנאי מתקיים. התנאי נבדק לפני כל סבב, ולכן אם הוא שקרי מההתחלה, הגוף לא רץ אף פעם. משהו בתוך הלולאה חייב לשנות את התנאי, אחרת היא לא נגמרת.
זה סוג השאלה ש-while נועדה לה: אתם לא יודעים מראש את מספר הסבבים, רק מתי לעצור. שנו את שיעור הריבית והריצו שוב.
do while: לרוץ לפחות פעם אחת
do { ... } while (condition); בודקת את התנאי אחרי הגוף, ולכן הגוף תמיד רץ פעם אחת. שימו לב לנקודה פסיק בסוף.
שימוש טיפוסי הוא "נסה, ואז בדוק": לזרוק קובייה עד שיוצא שש, לייצר קוד עד שהוא לא תפוס. הניסיון הראשון חייב לקרות לפני שיש משהו לבדוק. זה נותן תוצאה שונה בכל הרצה:
while (true) עם break
כשקל יותר לבדוק את תנאי היציאה באמצע הגוף, כתבו while (true) וצאו עם break. continue מדלג לבדיקה הבאה, כמו בכל לולאה.
array_shift() מחזירה null ברגע שהמערך ריק, וזו הדרך האחרת החוצה. אפשר היה לכתוב את אותה לולאה כ-while ($queue), כי מערך ריק נחשב false.
קריאת קובץ שורה אחר שורה
fgets() מחזירה שורה אחת בכל פעם ו-false בסוף הקובץ, ולכן היא מניעה לולאת while ישירות. הבלוק כותב קודם את הקובץ, ואז קורא אותו בחזרה.
הסוגריים סביב $line = fgets($handle) חשובים: ההצבה קורית קודם, ואז התוצאה מושווית ל-false. שימוש ב-!== false במקום בבדיקת אמיתות פשוטה מונע משורה אחרונה שמכילה רק 0 (בלי ירידת שורה אחריה) לסיים את הלולאה מוקדם. עמוד fopen() מסביר את פונקציות הקבצים.
while עם endwhile בתבניות
כמו if ו-for, ל-while יש צורת נקודתיים ל-HTML: while (...): ו-endwhile;. זו מדפיסה רשימת ספירה לאחור בלשונית Page.
טעות נפוצה: הלולאה שלא נגמרת
המונה חייב להתקדם לכיוון היציאה. שכחו את $i++, או שניתם את המשתנה הלא נכון, והתנאי נשאר אמת לנצח. בשרת web PHP עוצרת את הסקריפט אחרי max_execution_time (30 שניות כברירת מחדל) עם שגיאה קטלנית. בשורת הפקודה היא לא עוצרת לעולם.
// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
echo $i;
}
מגבלת ביטחון היא הגנה זולה ללולאות שתלויות בנתונים מבחוץ, כמו ניסיון חוזר של קריאה או מעבר בין דפי תוצאות:
הריצו את זה כמה פעמים: לפעמים זה מצליח מוקדם, לפעמים זה מוותר, אבל זה תמיד נגמר. כשאתם יודעים מראש את מספר הסבבים, לולאת for מציינת את ההתחלה, הסוף והצעד בשורה אחת, וקשה יותר לטעות בה.
שאלות נפוצות
מה ההבדל בין while ל-do while ב-PHP?
while בודקת את התנאי לפני כל סבב, ולכן ייתכן שהגוף לא ירוץ אף פעם. do { ... } while ($cond); בודקת אחרי כל סבב, ולכן הגוף תמיד רץ לפחות פעם אחת. שימו לב לנקודה פסיק אחרי התנאי של do while.
איך עוצרים לולאת while אינסופית ב-PHP?
בתוך הלולאה, סיימו אותה עם break כשתנאי היציאה שלכם מתקיים: while (true) { ...; if ($done) { break; } }. אם ללולאה אין break והתנאי שלה אף פעם לא הופך לשקרי, הסקריפט רץ עד ש-max_execution_time של PHP עוצר אותו (בבקשות web) או לנצח (בשורת הפקודה).
מתי להשתמש ב-while במקום ב-for ב-PHP?
השתמשו ב-while כשאתם לא יודעים כמה סבבים תצטרכו: קריאה עד סוף קובץ, ניסיון חוזר עד שמשהו מצליח, עיבוד תור עד שהוא מתרוקן. השתמשו ב-for כשאתם סופרים, וב-foreach כדי לעבור על כל איבר במערך.
האם יש ב-PHP לולאת do until?
לא. הפכו את תנאי העצירה בתוך do while: do { $n++; } while (!($n >= 3)); רצה עד ש-$n >= 3 מתקיים. until היא לא מילת מפתח של PHP.