PHP do-while ループ
do-while ループは、条件をチェックする前にまず一度コードブロックを実行し、その後、指定された条件が true(真)である限り、そのブロックの実行を繰り返します。最初に条件を評価する while ループとは異なり、do-while ループは、初期条件が満たされているかどうかに関わらず、波括弧内のコードが少なくとも一度は実行されることを保証します。
1. 少なくとも一度は実行される構文構造
この構文は特定のパターンに従います。do ブロックには実行したいロジックを記述し、while 条件はコードブロックの実行が完了した後に評価されます。
<?php
$attempts = 0;
do {
// このコードは少なくとも一度は実行されます
echo "試行回数:" . ($attempts + 1) . "<br>";
$attempts++;
} while ($attempts < 3);
?>上記のコードスニペットでは、まず do ブロック内部のコードが処理され、バリアブル(変数) $attempts がインクリメントされた後に、ようやく while 内の条件が評価されます。評価が最後に行われるため、プログラムは $attempts が 3 に達したときにのみループを抜けます。
2. do-while ループを使用すべきタイミング
バリデーション(検証)チェックを行う前に、必ず特定のアクションを先に発生させる必要があるビジネスロジックでは、do-while ループを使用してください。一般的なシナリオとしては、ユーザーに入力を促す場合や、外部サービスへの接続などがあります。つまり、ステータスが要求を満たしているかを確認する前に、まずその操作を試行しなければならないケースです。
例えば、データベースに存在しないユニークなランダム ID を生成し、重複しなくなるまで繰り返すシステムを設計したとしましょう。
<?php
// まず ID を生成しなければ、それが既に使用されているかどうかをチェックできません。
do {
$generatedId = rand(1000, 9999);
$isTaken = checkDatabaseForId($generatedId); // この関数は既に存在すると仮定します
} while ($isTaken === true);
echo "割り当てられた ID は:" . $generatedId;
?>ここで標準的な while ループを使用する場合、ループを開始させるためだけに $isTaken を定義し、ダミーの値(例:true)を割り当ててループを「騙す」必要があり、不要な複雑さが生じます。do-while ループは、このような冗長な初期化操作を完璧に排除します。
3. 実行フローの比較:while vs. do-while
while ループと do-while ループの根本的な違いは、条件を評価するエントリーポイント(切り口)にあります。
- while ループ: 標準的な
whileループは、コードを実行する前に条件をチェックします。(先にチケットを確認してから、門を入る) - do-while ループ:
do-whileループは、最初の条件チェックよりも先にロジックブロックが実行されることを保証します。(先に門に入ってから、チケットを確認する)
4. 潜在的な罠:無限ループ
do-while ループは常にその主体を少なくとも一度は実行するため、条件が永久に達成されず、かつループを抜けるためのステータス変更も行われない場合、極めて容易に 無限ループ(Infinite Loops) に陥ります。while 条件で使用されているバリアブルが、ループの実行プロセス中に必ず更新されていることを確認してください。
<?php
$i = 0;
// 危険な操作:$i の値が更新されないため、これは永久に実行され続けます
do {
echo $i;
} while ($i < 5);
?>スクリプトがサーバーのメモリや CPU リソースを際限なく消費するのを防ぐために、ループ内には常に明確で到達可能な終了パス(例えば、上記の do ブロック内に $i++; を追加するなど)があることを検証してください。