while (condition) { ... } koşul true olduğu sürece bloğu tekrar tekrar çalıştırır. Koşul her turdan önce kontrol edilir, bu yüzden baştan false ise gövde hiç çalışmaz. Döngünün içindeki bir şey koşulu değiştirmelidir, yoksa döngü hiç bitmez.
while tam da bu tür sorular için vardır: tur sayısını önceden bilmezsiniz, yalnızca ne zaman duracağınızı bilirsiniz. Faiz oranını değiştirin ve tekrar çalıştırın.
do while: en az bir kez çalıştır
do { ... } while (condition); koşulu gövdeden sonra kontrol eder, bu yüzden gövde her zaman bir kez çalışır. Sondaki noktalı virgüle dikkat edin.
Tipik kullanım "önce dene, sonra kontrol et" şeklindedir: altı gelene kadar zar at, kullanılmamış bir kod bulana kadar kod üret. Kontrol edilecek bir şey olmadan önce ilk denemenin yapılması gerekir. Bu örnek her çalıştırmada farklı bir sonuç verir:
break ile while (true)
Çıkış koşulunu gövdenin ortasında kontrol etmek daha kolaysa while (true) yazın ve break ile çıkın. continue her döngüde olduğu gibi bir sonraki kontrole atlar.
array_shift() dizi boşaldığında null döndürür, bu da diğer çıkış yoludur. Boş bir dizi false sayıldığı için aynı döngü while ($queue) olarak da yazılabilir.
Dosyayı satır satır okuma
fgets() her seferinde bir satır, dosyanın sonunda ise false döndürür, bu yüzden bir while döngüsünü doğrudan yönetir. Blok önce dosyayı yazar, sonra geri okur.
$line = fgets($handle) etrafındaki parantezler önemlidir: önce atama yapılır, sonra sonuç false ile karşılaştırılır. Düz bir truthy kontrolü yerine !== false kullanmak, yalnızca 0 içeren (ardından yeni satır olmayan) bir son satırın döngüyü erken bitirmesini önler. Dosya fonksiyonları fopen() sayfasında anlatılıyor.
Şablonlarda endwhile ile while
if ve for gibi while da HTML için iki noktalı bir biçime sahiptir: while (...): ve endwhile;. Bu örnek Page sekmesinde bir geri sayım listesi yazdırır.
Sık yapılan hata: hiç bitmeyen döngü
Sayaç çıkışa doğru ilerlemelidir. $i++ unutulursa ya da yanlış değişken değiştirilirse koşul sonsuza dek true kalır. Bir web sunucusunda PHP betiği max_execution_time (varsayılan 30 saniye) sonunda ölümcül bir hatayla durdurur. Komut satırında ise hiç durmaz.
// Never ends: $i is never changed
$i = 0;
while ($i < 3) {
echo $i;
}
Bir çağrıyı yeniden denemek ya da sonuçlar arasında sayfa sayfa ilerlemek gibi dış verilere bağlı döngüler için bir güvenlik sınırı ucuz bir korumadır:
Birkaç kez çalıştırın: bazen erken başarılı olur, bazen vazgeçer, ama her zaman biter. Tur sayısını baştan biliyorsanız bir for döngüsü başlangıcı, bitişi ve adımı tek satırda belirtir ve hata yapmak daha zordur.
Sıkça Sorulan Sorular
PHP'de while ile do while arasındaki fark nedir?
while koşulu her turdan önce kontrol eder, bu yüzden gövde hiç çalışmayabilir. do { ... } while ($cond); koşulu her turdan sonra kontrol eder, bu yüzden gövde her zaman en az bir kez çalışır. do while koşulundan sonraki noktalı virgüle dikkat edin.
PHP'de sonsuz bir while döngüsünü nasıl durdururum?
Çıkış koşulunuz sağlandığında döngünün içinde break ile bitirin: while (true) { ...; if ($done) { break; } }. Döngüde break yoksa ve koşulu hiç false olmuyorsa betik, PHP'nin max_execution_time ayarı onu durdurana kadar (web istekleri) ya da sonsuza dek (komut satırı) çalışır.
PHP'de for yerine ne zaman while kullanmalıyım?
Kaç tur gerektiğini bilmediğinizde while kullanın: bir dosyanın sonuna kadar okumak, bir şey başarılı olana kadar yeniden denemek, bir kuyruğu boşalana kadar işlemek. Sayarken for, bir dizinin her elemanını ziyaret etmek için foreach kullanın.
PHP'de do until döngüsü var mı?
Hayır. Bir do while içinde durma koşulunu tersine çevirin: do { $n++; } while (!($n >= 3)); $n >= 3 true olana kadar çalışır. until bir PHP anahtar kelimesi değildir.