PHP menangani banyak pekerjaan berulang di sisi server. Satu permintaan mungkin perlu memindai folder berisi gambar, memantau database hingga statusnya berubah, atau terus meminta input dari pengguna sampai memenuhi aturan Anda. Melakukan hal tersebut dengan menyalin dan menempel blok kode yang sama akan membuat kode menjadi rapuh dan hampir mustahil untuk dipelihara. Loop (perulangan) ada untuk menyelesaikan masalah ini secara tepat. Loop membungkus logika ke dalam blok yang dapat digunakan kembali, mengurangi kesalahan, dan menjaga aplikasi Anda tetap ringkas.
Sebagian besar pengembang PHP secara naluriah menggunakan loop for ketika mereka tahu berapa banyak iterasi yang dibutuhkan, atau loop while ketika jumlahnya bergantung pada kondisi dinamis. Namun, ada opsi ketiga, dan perilakunya cukup berbeda sehingga memilihnya di saat yang tepat dapat membuat kode Anda jauh lebih jelas. Loop do-while mengeksekusi kode di dalam bloknya terlebih dahulu, baru kemudian memeriksa apakah kode tersebut harus dijalankan lagi.
Apa yang Membuat Loop do-while Berbeda
Dalam loop while standar, PHP mengevaluasi kondisi sebelum masuk ke dalam blok. Jika kondisi awalnya bernilai false, blok tersebut akan dilewati sepenuhnya. Loop do-while membalikkan urutan tersebut. Ia menjalankan kode satu kali, mencapai akhir, dan baru kemudian memeriksa kondisi untuk memutuskan apakah akan mengulang kembali.
Sintaksnya terlihat seperti ini:
do {
// statements
} while ($condition);
Perhatikan titik koma setelah klausa while. Titik koma tersebut wajib ada, dan melupakannya akan menyebabkan kesalahan sintaks (syntax error). Blok di antara do dan while selalu dieksekusi setidaknya satu kali, bahkan jika kondisinya bernilai false sejak awal. Perilaku pasca-uji (post-test) ini bukan sekadar keunikan; inilah alasan utama mengapa loop ini ada.
Kapan Harus Menggunakan do-while
Ada tiga skenario umum di mana struktur ini sangat berguna: menampilkan menu, memvalidasi input, dan mencoba kembali tugas yang mungkin gagal. Dalam setiap kasus, logika menuntut agar tindakan dilakukan terlebih dahulu sebelum Anda dapat menilai apakah akan melanjutkan.
Menampilkan Menu
Bayangkan sebuah alat baris perintah (command-line tool) atau panel admin berbasis teks. Anda perlu mencetak daftar opsi, menunggu pengguna memilih satu, lalu memutuskan apakah akan menampilkan menu lagi. Anda tidak dapat memeriksa apakah pengguna memilih keluar (exit) sampai menu tersebut sudah muncul di layar.
$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);
Loop while biasa secara teknis dapat menangani hal ini, tetapi akan memaksa Anda untuk mengulang output menu satu kali sebelum loop dimulai, atau menginisialisasi $choice dengan nilai palsu hanya untuk memenuhi kondisi awal. Hal itu menyebarkan logika terkait ke dua tempat berbeda. Versi do-while menjaga tampilan, pembacaan, dan pemeriksaan tetap berada di dalam satu blok yang rapi.
Memvalidasi Input
Validasi input sering kali mengikuti pola yang sama. Anda ingin meminta input dari pengguna, memeriksa apa yang mereka berikan, dan mengulanginya jika tidak memenuhi aturan Anda. Karena permintaan (prompt) harus dilakukan sebelum pemeriksaan, loop do-while sangat cocok digunakan.
do {
$username = readline("Choose a username (min 3 chars): ");
$isValid = strlen($username) >= 3;
if (!$isValid) {
echo "That username is too short.\n";
}
} while (!$isValid);
Dengan loop while standar, Anda harus mengisi $username dengan string kosong dan menduplikasi baris prompt di atas loop agar kondisi memiliki sesuatu untuk dievaluasi. Pengulangan ini mengundang bug. Jika nantinya Anda mengubah pesan prompt, Anda mungkin ingat untuk mengeditnya di dalam loop tetapi lupa mengedit salinannya yang ada di atasnya. Struktur do-while menghilangkan risiko tersebut dengan menjamin bahwa prompt dijalankan di dalam blok sebelum kondisi apa pun diuji.
Mencoba Kembali Tugas yang Gagal
Permintaan jaringan, penguncian file (file locks), dan penulisan database terkadang gagal pada percobaan pertama tetapi berhasil sesaat kemudian. Anda biasanya ingin mencoba setidaknya satu kali, lalu terus mencoba hanya selama kegagalan tersebut berlanjut dan Anda masih memiliki kesabaran.
$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
}
Detail krusial di sini adalah bahwa permintaan dikirim sebelum PHP bertanya, “Apakah berhasil?” Loop while harus melakukan permintaan dummy atau mengatur flag sukses palsu sebelum memasuki loop, yang akan mengaburkan apa yang sebenarnya terjadi. Versi do-while membuat urutannya menjadi jujur: coba, periksa, dan putuskan.
Membandingkan do-while dan while
Perbedaan antara kedua loop ini adalah masalah waktu (timing). Pertimbangkan sebuah variabel yang dimulai dalam keadaan yang akan gagal dalam pengujian apa pun:
$x = 10;
while ($x < 5) {
echo $x; // Never runs
}
Terhadap nilai awal yang sama, loop do-while berperilaku seperti ini:
$x = 10;
do {
echo $x; // Runs once, outputs 10
} while ($x < 5);
Satu kali eksekusi yang terjamin itulah faktor penentunya. Jika logika Anda memerlukan nol atau lebih iterasi, while adalah alat yang lebih aman. Jika logika Anda memerlukan satu atau lebih iterasi, do-while biasanya adalah alat yang lebih bersih.
Jebakan dan Praktik Terbaik
Karena loop do-while menjamin setidaknya satu kali eksekusi, ia juga dapat menyebabkan loop tak terbatas jika Anda tidak berhati-hati. Jika variabel yang diperiksa dalam kondisi tidak pernah berubah di dalam blok tersebut, PHP akan terus berjalan selamanya atau hingga mencapai batas waktu eksekusi maksimum.
Kesalahan umum lainnya adalah melewatkan titik koma di akhir. Kode berikut akan gagal:
do {
// code
} while ($x < 5) // syntax error
Anda juga harus menghindari penggunaan do-while hanya karena kebiasaan ketika loop lain lebih ekspresif. Jika Anda melakukan iterasi pada sebuah array, foreach hampir selalu lebih unggul. Jika Anda mengelola penghitung numerik sederhana, loop for menjaga inisialisasi, kondisi, dan penambahan (increment) dalam satu baris, sehingga lebih mudah untuk dipindai.
Dari segi performa, do-while tidak membawa beban (overhead) yang berarti dibandingkan dengan while di PHP. Keuntungannya sepenuhnya bersifat struktural. Ketika pengembang lain melihat loop do-while, mereka akan segera memahami bahwa blok tersebut harus dijalankan sebelum kondisi apa pun dievaluasi. Informasi tunggal tersebut menghindarkan mereka dari melacak variabel dummy atau kode pengaturan (setup) yang terduplikasi di atas loop while standar.
Kasus Batas dan Pola Alternatif
Terkadang loop do-while berguna bahkan ketika tidak ada interaksi pengguna yang terlibat. Misalnya, saat menggunakan generator atau cursor yang menghasilkan setidaknya satu item, Anda dapat memproses item pertama dan kemudian memeriksa apakah cursor telah maju ke posisi berikutnya yang valid. Dalam basis kode lama (legacy) yang menggunakan sumber daya database mentah alih-alih kumpulan hasil (result sets) modern, Anda mungkin melihat pola seperti ini:
$row = $result->fetch();
do {
// process $row
} while ($row = $result->fetch());
Meskipun PHP modern lebih menyukai foreach dengan PDO, pola ini mengilustrasikan bagaimana do-while menangani iterasi pertama sebagai kasus khusus tanpa percabangan tambahan.
Kesimpulan Utama
Loop do-while adalah alat yang spesifik, tetapi di tempat yang tepat, ia adalah satu-satunya alat yang masuk akal. Ia menjaga logika pengaturan dan validasi Anda di satu tempat, menjamin bahwa suatu tindakan dicoba sebelum dinilai, dan mengomunikasikan niat Anda secara langsung kepada orang berikutnya yang membaca kode tersebut. Ketika kondisi harus muncul setelah pekerjaan selesai, gunakan do-while. Dalam kasus lainnya, biarkan while, for, atau foreach yang lebih sederhana melakukan tugasnya.
