PHPを用いたシステム開発において、条件分岐(if文)はプログラムの流れを制御するための最も基本的な要素です。
複数の条件を組み合わせて複雑なロジックを構築する際、AND(かつ)やOR(または)といった論理演算子の正しい使い分けが不可欠となります。
本記事では、PHPにおけるif文の複数条件の書き方から、間違いやすい論理演算子の優先順位、実務で役立つテクニックまで詳しく解説します。
初心者の方から、より堅牢なコードを書きたい中級者の方まで、条件分岐の理解を深めるための参考にしてください。
PHPのif文でAND条件(かつ)を使用する方法
複数の条件がすべて「真(true)」である場合にのみ処理を実行したいときは、AND演算子を使用します。
PHPでは、一般的に&&という記号を用いて記述します。
例えば、数値が10以上、かつ、20以下であるといった範囲指定などで頻繁に利用されます。
<?php
$age = 25;
$has_license = true;
// 年齢が18歳以上、かつ、免許を持っている場合
if ($age >= 18 && $has_license) {
echo "運転可能です。";
} else {
echo "運転できません。";
}
?>
運転可能です。
このコードでは、$age >= 18と$has_licenseの両方が真であるときだけ、最初のブロックが実行されます。
どちらか一方でも条件を満たさない場合は、elseの処理へ移ります。
PHPのif文でOR条件(または)を使用する方法
複数の条件のうち、少なくとも1つが「真(true)」であれば処理を実行したい場合には、OR演算子を用います。
PHPでは、||という記号(パイプ記号を2つ)を使って表現します。
例えば、週末であるか、もしくは祝日であるかといった、いずれかの条件に該当する場合の判定に適しています。
<?php
$day = "Sunday";
$is_holiday = false;
// 日曜日であるか、または祝日である場合
if ($day === "Sunday" || $is_holiday) {
echo "本日は休業日です。";
} else {
echo "本日は営業日です。";
}
?>
本日は休業日です。
この例では、$is_holidayがfalseであっても、$dayが"Sunday"であるため、全体の条件は「真」となります。
論理演算子の優先順位と括弧の重要性
ANDとORを組み合わせて複雑な条件を作る場合、演算子の優先順位に注意を払う必要があります。
PHPにおいて、&&は||よりも優先順位が高く設定されています。
そのため、意図した順番で評価されないと思わぬバグの原因となります。
優先順位を明確にし、コードの可読性を高めるためには、括弧 () を使って条件をグループ化することが推奨されます。
<?php
$is_admin = false;
$is_editor = true;
$is_active = false;
// 管理者または編集者であり、かつアカウントが有効である必要がある場合
// 以下の書き方は誤りです(優先順位の関係で意図通りに動きません)
if ($is_admin || $is_editor && $is_active) {
echo "アクセス許可(誤判定の可能性あり)";
}
// 括弧を使ってグループ化するのが正解です
if (($is_admin || $is_editor) && $is_active) {
echo "アクセス許可(正しい判定)";
} else {
echo "アクセス拒否";
}
?>
アクセス拒否
上記の例で括弧がない場合、$is_editor && $is_activeが先に評価されてしまいます。
その結果、管理者のフラグが立っていれば有効状態に関わらず許可されるという不具合が発生します。
「&&」「||」と「and」「or」の違い
PHPにはANDやORを表現する際、記号以外にandやorというキーワードも用意されています。
これらは一見同じ機能に見えますが、結合の優先順位が大きく異なる点に注意してください。
特に、代入演算子(=)と組み合わせた際に挙動の違いが顕著に現れます。
| 演算子 | 優先順位 | 主な用途 |
|---|---|---|
&&, || | 高い | if文などの条件分岐での標準的な使用 |
and, or | 非常に低い | 特定の制御フロー(or die() など) |
以下のコードで、代入時における優先順位の影響を確認してみましょう。
<?php
$result1 = true && false; // $result1 は false
$result2 = true and false; // $result2 は true
var_dump($result1);
var_dump($result2);
?>
bool(false)
bool(true)
and演算子は=よりも優先順位が低いため、先に$result2 = trueという代入が実行されてしまいます。
一般的なif文の条件式では、特別な理由がない限り && と || を使用するのが業界のデファクトスタンダードです。
短絡評価(ショートサーキット)の仕組み
PHPの論理演算子には、処理を効率化するための「短絡評価」という仕組みが備わっています。
これは、全体の判定結果が確定した時点で、それ以降の条件式の評価をスキップする仕組みです。
AND演算子の場合、左側の条件が「偽」であれば、右側の条件が何であれ結果は「偽」となるため、右側は評価されません。
OR演算子の場合は、左側の条件が「真」であれば、全体の評価が「真」に確定するため、右側は評価されません。
この性質を利用することで、エラーを回避するコードを書くことができます。
<?php
$user = null;
// $userがnullの場合、後半の $user->getName() は実行されないためエラーを回避できる
if ($user !== null && $user->getName() === 'Admin') {
echo "管理者です。";
}
?>
もし短絡評価がなければ、$user->getName()がnullに対して呼び出され、エラー(Fatal error)が発生してしまいます。
実践:否定演算子(NOT)との組み合わせ
複雑な条件分岐では、否定演算子(!)を組み合わせることも多いでしょう。
「〜ではない場合」という否定を含めると論理が混乱しやすいため、丁寧に整理することが大切です。
<?php
$is_maintenance = false;
$is_logged_in = true;
// メンテナンス中ではなく、かつログインしている場合
if (!$is_maintenance && $is_logged_in) {
echo "サイトを利用できます。";
}
?>
条件が複雑になりすぎた場合は、「ド・モルガンの法則」を意識して、論理を反転させることで読みやすくなるケースもあります。
しかし、まずは「何が真のときに実行したいか」を肯定文で考えるのが、ミスを減らす近道です。
まとめ
PHPのif文におけるAND・OR条件の扱いは、Web開発のあらゆる場面で登場します。
基本的には、優先順位の高い && と || を使用するようにしましょう。
複数の条件を組み合わせる際は、たとえ優先順位が正しくても、括弧 () を用いて視覚的にグループ化することで可読性が向上します。
また、短絡評価の性質を理解しておくと、無駄な処理を減らし、ヌルポインタエラーなどを未然に防ぐ安全なコードが書けるようになります。
演算子の優先順位や正しい書き方をマスターして、バグの少ない、メンテナンス性の高いプログラムを目指しましょう。
