PHP mengendalikan banyak kerja berulang di bahagian pelayan. Satu permintaan mungkin perlu mengimbas folder yang penuh dengan imej, menyemak pangkalan data sehingga status berubah, atau terus meminta input daripada pengguna sehingga ia memenuhi peraturan anda. Melakukan mana-mana perkara tersebut dengan menyalin dan menampal blok kod yang sama akan menjadikannya rapuh dan hampir mustahil untuk diselenggara. Gelung (loops) wujud untuk menyelesaikan masalah ini secara tepat. Ia membungkus logik ke dalam blok yang boleh digunakan semula, mengurangkan ralat, dan memastikan aplikasi anda ringkas.
Kebanyakan pembangun PHP secara naluri akan menggunakan gelung for apabila mereka tahu berapa banyak iterasi yang diperlukan, atau gelung while apabila bilangan tersebut bergantung pada keadaan dinamik. Walau bagaimanapun, terdapat pilihan ketiga, dan ia berkelakuan cukup berbeza sehingga memilihnya pada saat yang tepat boleh menjadikan kod anda jauh lebih jelas. Gelung do-while melaksanakan kod di dalam bloknya terlebih dahulu, kemudian menyemak sama ada ia perlu dijalankan semula.
Apa yang Membezakan Gelung do-while
Dalam gelung while standard, PHP menilai keadaan sebelum ia memasuki blok tersebut. Jika keadaan bermula dengan palsu (false), blok tersebut akan dilangkau sepenuhnya. Gelung do-while menterbalikkan urutan tersebut. Ia menjalankan kod sekali, sampai ke penghujung, dan hanya selepas itu menyemak keadaan untuk memutuskan sama ada perlu kembali ke gelung.
Sintaksnya kelihatan seperti ini:
do {
// statements
} while ($condition);
Perhatikan tanda titik koma (semicolon) selepas klausa while. Tanda titik koma tersebut adalah wajib, dan melupakannya akan menyebabkan ralat sintaks. Blok di antara do dan while sentiasa dilaksanakan sekurang-kurangnya satu kali, walaupun keadaan adalah palsu dari permulaan. Tingkah laku pasca-ujian (post-test) ini bukan sekadar keunikan; ia adalah sebab utama mengapa gelung ini wujud.
Bila Perlu Menggunakan do-while
Terdapat tiga senario biasa di mana struktur ini sangat berguna: memaparkan menu, mengesahkan input, dan mencuba semula tugasan yang mungkin gagal. Dalam setiap kes, logik memerlukan tindakan berlaku sebelum anda boleh menilai sama ada perlu meneruskan atau tidak.
Memaparkan Menu
Bayangkan satu alat baris arahan (command-line tool) atau panel admin berasaskan teks. Anda perlu mencetak senarai pilihan, menunggu pengguna memilih satu, dan kemudian memutuskan sama ada mahu memaparkan menu itu semula. Anda tidak boleh menyemak sama ada pengguna memilih keluar (exit) sehingga menu tersebut sudah pun muncul di skrin.
$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);
Gelung while biasa secara teknikalnya boleh mengendalikan perkara ini, tetapi ia akan memaksa anda mengulang output menu sekali sebelum gelung bermula, atau memulakan $choice dengan nilai palsu semata-mata untuk memenuhi keadaan awal. Ini akan menyebarkan logik yang berkaitan ke dua tempat yang berbeza. Versi do-while mengekalkan paparan, pembacaan, dan semakan di dalam satu blok yang kemas.
Mengesahkan Input
Pengesahan input sering kali mengikut corak yang sama. Anda mahu meminta input daripada pengguna, memeriksa apa yang mereka berikan, dan mengulanginya jika ia gagal memenuhi peraturan anda. Oleh kerana permintaan (prompt) mesti berlaku sebelum pemeriksaan, gelung do-while sangat sesuai 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 gelung while standard, anda perlu menetapkan $username dengan string kosong dan menduplikasi baris permintaan di atas gelung supaya keadaan mempunyai sesuatu untuk dinilai. Pengulangan ini mengundang pepijat (bugs). Jika anda kemudian mengubah mesej permintaan, anda mungkin ingat untuk menyuntingnya di dalam gelung tetapi terlupa menyunting salinan yang ada di atasnya. Struktur do-while menghapuskan risiko tersebut dengan menjamin bahawa permintaan dijalankan di dalam blok sebelum sebarang keadaan diuji.
Mencuba Semula Tugasan yang Gagal
Permintaan rangkaian (network requests), kunci fail (file locks), dan penulisan pangkalan data kadangkala gagal pada percubaan pertama tetapi berjaya sejurus selepas itu. Anda biasanya mahu mencuba sekurang-kurangnya sekali, kemudian terus mencuba selagi kegagalan berterusan dan anda masih mempunyai 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
}
Perincian penting di sini ialah permintaan dihantar sebelum PHP bertanya, "Adakah ia berjaya?". Gelung while perlu melakukan permintaan dummy atau menetapkan flag kejayaan palsu sebelum memasuki gelung, yang mana akan mengaburkan apa yang sebenarnya berlaku. Versi do-while menjadikan urutan itu jujur: cuba, periksa, dan putuskan.
Membandingkan do-while dan while
Perbezaan antara kedua-dua gelung ini adalah soal masa (timing). Pertimbangkan satu pemboleh ubah yang bermula dalam keadaan yang akan gagal dalam sebarang ujian:
$x = 10;
while ($x < 5) {
echo $x; // Never runs
}
Terhadap nilai permulaan yang sama, gelung do-while berkelakuan seperti ini:
$x = 10;
do {
echo $x; // Runs once, outputs 10
} while ($x < 5);
Pelaksanaan tunggal yang dijamin itu adalah faktor penentu. Jika logik anda memerlukan sifar atau lebih iterasi, while adalah alat yang lebih selamat. Jika logik anda memerlukan satu atau lebih iterasi, do-while biasanya adalah alat yang lebih kemas.
Perangkap dan Amalan Terbaik
Oleh sebab gelung do-while menjanjikan sekurang-kurangnya satu pelaksanaan, ia juga boleh menyebabkan gelung infiniti jika anda tidak berhati-hati. Jika pemboleh ubah yang disemak dalam syarat tidak pernah berubah di dalam blok tersebut, PHP akan berputar selama-lamanya atau sehingga ia mencapai had masa pelaksanaan maksimum.
Kesilapan biasa yang lain adalah tertinggal tanda titik bertitik (semicolon) di hujung. Berikut ini akan gagal:
do {
// code
} while ($x < 5) // syntax error
Anda juga harus mengelak daripada menggunakan do-while hanya kerana tabiat apabila gelung lain lebih ekspresif. Jika anda melakukan iterasi ke atas tatasusunan (array), foreach hampir sentiasa lebih baik. Jika anda menguruskan pengira numerik yang ringkas, gelung for mengekalkan inisialisasi, syarat, dan peningkatan dalam satu baris, yang menjadikannya lebih mudah untuk disemak.
Dari segi prestasi, do-while tidak membawa beban (overhead) yang bermakna berbanding while dalam PHP. Kelebihannya adalah sepenuhnya dari segi struktur. Apabila pembangun lain melihat gelung do-while, mereka akan segera memahami bahawa blok tersebut mesti dijalankan sebelum sebarang syarat dinilai. Maklumat tunggal tersebut menyelamatkan mereka daripada menjejaki pemboleh ubah dummy atau kod penyediaan yang berulang di atas gelung while standard.
Kes Pinggiran dan Corak Alternatif
Kadangkala gelung do-while berguna walaupun tanpa melibatkan interaksi pengguna. Sebagai contoh, apabila menggunakan generator atau kursor yang menghasilkan sekurang-kurangnya satu item, anda boleh memproses item pertama dan kemudian menyemak sama ada kursor telah maju ke kedudukan seterusnya yang sah. Dalam pangkalan kod lama yang menggunakan sumber pangkalan data mentah dan bukannya set hasil moden, anda mungkin melihat corak seperti ini:
$row = $result->fetch();
do {
// process $row
} while ($row = $result->fetch());
Walaupun PHP moden lebih mengutamakan foreach dengan PDO, corak ini menggambarkan bagaimana do-while mengendalikan iterasi pertama sebagai kes khas tanpa percabangan tambahan.
Kesimpulan Utama
Gelung do-while adalah alat yang khusus, tetapi di tempat yang betul, ia adalah satu-satunya alat yang masuk akal. Ia mengekalkan logik penyediaan dan pengesahan anda di satu tempat, menjamin bahawa sesuatu tindakan dicuba sebelum ia dinilai, dan menyampaikan niat anda secara terus kepada orang seterusnya yang membaca kod tersebut. Apabila syarat mesti datang selepas kerja dilakukan, gunakan do-while. Dalam setiap kes yang lain, biarkan while, for, atau foreach yang lebih ringkas melakukan tugas tersebut.
