تنفّذ while (condition) { ... } الكتلة مرة بعد مرة ما دام الشرط صحيحًا. يُفحص الشرط قبل كل دورة، فإذا كان خاطئًا من البداية لا يُنفَّذ الجسم أبدًا. لا بد أن يغيّر شيء داخل الحلقة الشرط، وإلا فلن تنتهي.
هذا هو نوع السؤال الذي صُنعت له while: لا تعرف عدد الدورات مسبقًا، بل تعرف متى تتوقف فقط. غيّر نسبة الفائدة وشغّله مرة أخرى.
do while: التنفيذ مرة واحدة على الأقل
تفحص do { ... } while (condition); الشرط بعد الجسم، لذا يُنفَّذ الجسم مرة واحدة دائمًا. لاحظ الفاصلة المنقوطة في النهاية.
استخدامها المعتاد هو «جرّب ثم افحص»: ارمِ نردًا حتى تحصل على ستة، وولّد رمزًا حتى تجد رمزًا غير مستخدم. لا بد أن تحدث المحاولة الأولى قبل أن يوجد ما يُفحص. وهذا المثال يعطي نتيجة مختلفة في كل تشغيل:
while (true) مع break
عندما يكون فحص شرط الخروج أسهل في منتصف الجسم، اكتب while (true) واخرج بـ break. وتقفز continue إلى الفحص التالي، كما في أي حلقة.
تعيد array_shift() القيمة null حين تفرغ المصفوفة، وهذا هو المخرج الآخر. ويمكن كتابة الحلقة نفسها على شكل while ($queue)، لأن المصفوفة الفارغة تُعدّ خاطئة.
قراءة ملف سطرًا سطرًا
تعيد fgets() سطرًا واحدًا في كل مرة وfalse عند نهاية الملف، لذا فهي تقود حلقة while مباشرة. تكتب الكتلة الملف أولًا، ثم تقرؤه.
للأقواس حول $line = fgets($handle) أهمية: يحدث الإسناد أولًا، ثم تُقارن النتيجة بـ false. واستخدام !== false بدل فحص بسيط للقيمة المنطقية يمنع سطرًا أخيرًا لا يحمل إلا 0 (دون سطر جديد بعده) من إنهاء الحلقة مبكرًا. تشرح صفحة fopen() دوال الملفات.
while مع endwhile في القوالب
مثل if وfor، لـ while صيغة بالنقطتين لـ HTML: while (...): وendwhile;. يطبع هذا المثال قائمة عدّ تنازلي في تبويب Page.
خطأ شائع: الحلقة التي لا تنتهي
يجب أن يتحرك العداد نحو المخرج. انسَ $i++، أو غيّر المتغير الخطأ، فيبقى الشرط صحيحًا إلى الأبد. على خادم ويب توقف 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 (طلبات الويب) أو إلى الأبد (سطر الأوامر).
متى أستخدم while بدل for في PHP؟
استخدم while عندما لا تعرف عدد الدورات التي تحتاجها: القراءة حتى نهاية ملف، وإعادة المحاولة حتى ينجح شيء ما، ومعالجة طابور حتى يفرغ. واستخدم for عندما تعدّ، وforeach لزيارة كل عنصر في مصفوفة.
هل في PHP حلقة do until؟
لا. اعكس شرط التوقف في do while: تعمل do { $n++; } while (!($n >= 3)); حتى تصبح $n >= 3 صحيحة. وuntil ليست كلمة محجوزة في PHP.