PHP:if-elseif-else文は条件式の順序に気をつけないと破綻する

以下のケースの場合なら、81で割って余りがないものは先に処理してtrueにしてしまい、次に9で割って余りがないものはfalseにしてしまい、最後に3で割って余りがないものをtrueにする。この順序を変えると漏れが起こる。

function funcname(int $num): bool{
    // 条件式の順序に気を付ける。広い範囲を先にしてしまうとあとの狭い範囲の条件を通らずに処理が済んでしまう。
    if ($num % 81 == 0) return true;
    elseif ($num % 9 == 0) return false;
    elseif ($num % 3 == 0) return true;
    return false;
}
echo (funcname(771) ? "true" : "false") . PHP_EOL;
echo (funcname(1442) ? "true" : "false") . PHP_EOL;
echo (funcname(963) ? "true" : "false") . PHP_EOL;
echo (funcname(587) ? "true" : "false") . PHP_EOL;
目次
閉じる