PHP, sunucu tarafında birçok tekrarlayan işi halleder. Tek bir istek; görsellerle dolu bir klasörü taramak, bir durum değişene kadar bir veritabanını sorgulamak veya kurallarınıza uyan bir girdi alana kadar kullanıcıdan girdi istemeye devam etmek zorunda kalabilir. Bunların herhangi birini aynı kod bloğunu kopyalayıp yapıştırarak yapmak kırılgan olurdu ve bakımı neredeyse imkansız hale gelirdi. Döngüler tam olarak bu sorunu çözmek için vardır. Mantığı yeniden kullanılabilir bir blok içine sararlar, hataları azaltırlar ve uygulamanızı kompakt tutarlar.
Çoğu PHP geliştiricisi, kaç yineleme yapmaları gerektiğini bildiklerinde içgüdüsel olarak bir for döngüsüne, sayı dinamik bir koşula bağlı olduğunda ise bir while döngüsüne başvurur. Ancak üçüncü bir seçenek daha vardır ve bu seçenek, doğru zamanda seçildiğinde kodunuzu önemli ölçüde daha net hale getirecek kadar farklı davranır. do-while döngüsü, önce bloğun içindeki kodu çalıştırır, ardından tekrar çalıştırılıp çalıştırılmayacağını kontrol eder.
do-while Döngüsünü Farklı Kılan Nedir
Standart bir while döngüsünde PHP, bloğa girmeden önce koşulu değerlendirir. Eğer koşul en başta yanlış (false) ise, blok tamamen atlanır. Bir do-while döngüsü bu sırayı tersine çevirir. Kodu bir kez çalıştırır, sona ulaşır ve ancak o zaman döngüye geri dönüp dönmeyeceğine karar vermek için koşulu kontrol eder.
Sözdizimi şöyledir:
do {
// statements
} while ($condition);
while ifadesinden sonraki noktalı virgüle dikkat edin. Bu noktalı virgül gereklidir ve unutulması sözdizimi hatasına (syntax error) yol açar. do ve while arasındaki blok, koşul en başından itibaren yanlış olsa bile her zaman en az bir kez çalıştırılır. Bu "test sonrası" (post-test) davranışı sadece bir tuhaflık değildir; döngünün var olma sebebi tam olarak budur.
Ne Zaman do-while Kullanılmalı
Bu yapının parladığı üç yaygın senaryo vardır: bir menü görüntülemek, girdi doğrulamak ve başarısız olabilecek bir görevi yeniden denemek. Her durumda mantık, devam edip etmeyeceğinize karar vermeden önce işlemin gerçekleşmesini gerektirir.
Menü Görüntüleme
Bir komut satırı aracı veya metin tabanlı bir yönetici paneli hayal edin. Bir seçenek listesi yazdırmanız, kullanıcının birini seçmesini beklemeniz ve ardından menüyü tekrar gösterip göstermeyeceğinize karar vermeniz gerekir. Menü ekranda görünmeden kullanıcının çıkış yapıp yapmadığını kontrol edemezsiniz.
$choice = 0;
do {
echo "1. View Reports\n";
echo "2. Export Data\n";
echo "3. Exit\n";
$choice = (int) readline("Select an option: ");
if ($choice === 1) {
// fetch and display reports
} elseif ($choice === 2) {
// run export logic
}
} while ($choice !== 3);
Normal bir while döngüsü teknik olarak bunu halledebilir, ancak döngü başlamadan önce menü çıktısını bir kez tekrarlamanıza veya yalnızca başlangıç koşulunu sağlamak için $choice değişkenini sahte bir değerle başlatmanıza neden olur. Bu durum, ilgili mantığı iki farklı yere dağıtır. do-while versiyonu ise görüntülemeyi, okumayı ve kontrolü tek bir düzenli blok içinde tutar.
Girdi Doğrulama
Girdi doğrulaması genellikle aynı deseni izler. Kullanıcıya bir istem (prompt) sunmak, verdiklerini incelemek ve kurallarınıza uymuyorsa tekrarlamak istersiniz. İstem, incelemeden önce gerçekleşmesi gerektiğinden, bir do-while döngüsü doğal bir şekilde uyar.
do {
$username = readline("Choose a username (min 3 chars): ");
$isValid = strlen($username) >= 3;
if (!$isValid) {
echo "That username is too short.\n";
}
} while (!$isValid);
Standart bir while döngüsüyle, koşulun değerlendirebileceği bir şey olması için $username değişkenini boş bir dize ile başlatmanız ve istem satırını döngünün üzerine kopyalamanız gerekir. Bu tekrarlama hatalara davetiye çıkarır. Eğer daha sonra istem mesajını değiştirirseniz, döngü içindeki kısmı düzenlemeyi hatırlayıp üstteki kopyayı unutabilirsiniz. do-while yapısı, herhangi bir koşul test edilmeden önce istemin blok içinde çalışacağını garanti ederek bu riski ortadan kaldırır.
Başarısız Bir Görevi Yeniden Deneme
Ağ istekleri, dosya kilitleri ve veritabanı yazma işlemleri bazen ilk denemede başarısız olur ancak kısa bir süre sonra başarılı olur. Genellikle en az bir kez denemek, ardından yalnızca hata devam ettiği sürece ve sabrınız kaldığı sürece denemeye devam etmek istersiniz.
$attempts = 0;
$maxRetries = 3;
$success = false;
do {
$attempts++;
$response = @file_get_contents('https://api.example.com/status');
if ($response !== false) {
$success = true;
} elseif ($attempts < $maxRetries) {
sleep(1);
}
} while (!$success && $attempts < $maxRetries);
if (!$success) {
// log the permanent failure
}
Buradaki kritik ayrıntı, isteğin PHP henüz "Çalıştı mı?" diye sormadan önce gönderilmesidir. Bir while döngüsü, döngüye girmeden önce sahte bir istek yapmalı veya sahte bir başarı bayrağı ayarlamalıdır; bu da gerçekte ne olup bittiğini belirsizleştirir. do-while versiyonu ise diziyi dürüst kılar: dene, incele ve karar ver.
do-while ve while Karşılaştırması
Bu iki döngü arasındaki fark bir zamanlama meselesidir. Herhangi bir testi geçemeyecek bir durumda başlayan bir değişkeni düşünün:
$x = 10;
while ($x < 5) {
echo $x; // Never runs
}
Aynı başlangıç değeriyle, bir do-while döngüsü şöyle davranır:
$x = 10;
do {
echo $x; // Runs once, outputs 10
} while ($x < 5);
O tek ve garantili çalıştırma belirleyici faktördür. Eğer mantığınız sıfır veya daha fazla yineleme gerektiriyorsa, while daha güvenli bir araçtır. Eğer mantığınız bir veya daha fazla yineleme gerektiriyorsa, do-while genellikle daha temiz bir araçtır.
Tuzaklar ve En İyi Uygulamalar
do-while döngüsü en az bir kez çalışmayı garanti ettiği için, dikkatli olmazsanız sonsuz bir döngüye de neden olabilir. Eğer koşulda kontrol edilen değişkenler blok içinde hiç değişmezse, PHP sonsuza kadar döner veya maksimum yürütme süresine ulaşana kadar çalışmaya devam eder.
Bir diğer yaygın hata ise sondaki noktalı virgülü unutmaktır. Aşağıdaki kod hata verecektir:
do {
// code
} while ($x < 5) // syntax error
Başka bir döngü daha açıklayıcıyken, alışkanlık gereği do-while döngüsüne başvurmaktan kaçınmalısınız. Bir dizi üzerinde yineleme yapıyorsanız, foreach neredeyse her zaman daha üstündür. Basit bir sayısal sayacı yönetiyorsanız, bir for döngüsü başlatma, koşul ve artırma işlemlerini tek bir satırda tutarak kodun okunmasını kolaylaştırır.
Performans açısından, PHP'de do-while döngüsünün while döngüsüne kıyasla anlamlı bir ek yükü yoktur. Faydası tamamen yapısal düzeydedir. Başka bir geliştirici bir do-while döngüsü gördüğünde, bloğun herhangi bir koşul değerlendirilmeden önce çalışması gerektiğini hemen anlar. Bu tek bilgi, geliştiricinin standart bir while döngüsünün üzerindeki geçici değişkenleri veya yinelenen kurulum kodlarını takip etmek zorunda kalmasını engeller.
Uç Durumlar ve Alternatif Desenler
Bazen bir do-while döngüsü, kullanıcı etkileşimi olmasa bile yararlı olabilir. Örneğin, en az bir öğe döndüren bir generator veya cursor tüketirken, ilk öğeyi işleyebilir ve ardından imlecin geçerli bir sonraki konuma ilerleyip ilerlemediğini kontrol edebilirsiniz. Modern sonuç kümeleri yerine ham veritabanı kaynaklarını kullanan eski kod tabanlarında şöyle bir desen görebilirsiniz:
$row = $result->fetch();
do {
// process $row
} while ($row = $result->fetch());
Modern PHP, PDO ile foreach kullanımını tercih etse de bu desen, do-while döngüsünün ilk yinelemeyi ekstra dallanma (branching) yapmadan nasıl özel bir durum olarak ele aldığını gösterir.
Asıl Çıkarım
do-while döngüsü dar kapsamlı bir araçtır, ancak doğru yerde kullanıldığında mantıklı olan tek araçtır. Kurulum ve doğrulama mantığınızı tek bir yerde tutar, bir eylemin değerlendirilmeden önce denenmesini garanti eder ve niyetinizi kodu okuyan bir sonraki kişiye doğrudan iletir. Koşulun işlemden sonra gelmesi gerekiyorsa do-while kullanın. Diğer tüm durumlarda, işi daha basit olan while, for veya foreach döngülerine bırakın.
