PHPの論理演算子は、複数の条件式を組み合わせて真偽値を判定するための演算子です。&&(AND)、||(OR)、!(NOT)が基本で、条件分岐やバリデーションで欠かせない機能です。
特に重要なのが短絡評価(short-circuit evaluation)の仕組みです。左辺の評価だけで結果が確定する場合、右辺は評価されません。この特性を活かした効率的なコーディングが可能です。
基本的な使い方
PHP
<?php
$a = true;
$b = false;
// AND(&&):両方trueのときtrue
echo "true && true = " . var_export($a && $a, true) . "\n";
echo "true && false = " . var_export($a && $b, true) . "\n";
// OR(||):どちらかがtrueならtrue
echo "true || false = " . var_export($a || $b, true) . "\n";
echo "false || false = " . var_export($b || $b, true) . "\n";
// NOT(!):真偽値を反転
echo "!true = " . var_export(!$a, true) . "\n";
echo "!false = " . var_export(!$b, true) . "\n";
実行結果
true && true = true
true && false = false
true || false = true
false || false = false
!true = false
!false = true
短絡評価(ショートサーキット)
&& では左辺が false なら右辺を評価せず false を返します。|| では左辺が true なら右辺を評価せず true を返します。
PHP
<?php
function checkA(): bool {
echo "Aを評価\n";
return false;
}
function checkB(): bool {
echo "Bを評価\n";
return true;
}
echo "--- AND(&&)の短絡評価 ---\n";
$result = checkA() && checkB();
echo "結果: " . var_export($result, true) . "\n\n";
echo "--- OR(||)の短絡評価 ---\n";
$result = checkB() || checkA();
echo "結果: " . var_export($result, true) . "\n";
実行結果
--- AND(&&)の短絡評価 ---
Aを評価
結果: false
--- OR(||)の短絡評価 ---
Bを評価
結果: true
ANDでは checkA() が false を返した時点で結果が確定するため、checkB() は呼ばれません。ORでは checkB() が true を返した時点で結果が確定するため、checkA() は呼ばれません。
短絡評価を活用した安全なコード
この特性を使って、エラーを防ぐ安全なコードが書けます。
PHP
<?php
// nullチェックしてからメソッド呼び出し
$user = null;
// $userがnullなら右辺は評価されない(エラーにならない)
$isAdmin = $user !== null && $user["role"] === "admin";
echo "管理者: " . var_export($isAdmin, true) . "\n";
// 配列の存在チェックしてから値を参照
$config = ["debug" => true];
if (isset($config["debug"]) && $config["debug"] === true) {
echo "デバッグモード有効\n";
}
// デフォルト値のパターン(||を活用)
$name = "" || "ゲスト"; // 注意:PHPでは||はboolを返す
$name = "" ?: "ゲスト"; // ?:(Elvis演算子)を使う方が適切
echo "名前: " . $name . "\n";
実行結果
管理者: false
デバッグモード有効
名前: ゲスト
記号演算子と英単語演算子の違い
PHPには && と and、|| と or がありますが、優先順位が異なります。
PHP
<?php
// &&は=より優先順位が高い
$a = true && false;
echo "\$a = true && false → " . var_export($a, true) . "\n";
// andは=より優先順位が低い
$b = true and false; // ($b = true) and false と同じ
echo "\$b = true and false → " . var_export($b, true) . "\n";
実行結果
$a = true && false → false
$b = true and false → true
実用的な例
PHP
<?php
// フォームバリデーション
function validateUser(array $data): array {
$errors = [];
if (!isset($data["name"]) || trim($data["name"]) === "") {
$errors[] = "名前は必須です";
}
if (!isset($data["age"]) || !is_numeric($data["age"]) || $data["age"] < 0) {
$errors[] = "年齢は0以上の数値です";
}
if (isset($data["email"]) && !filter_var($data["email"], FILTER_VALIDATE_EMAIL)) {
$errors[] = "メールアドレスの形式が不正です";
}
return $errors;
}
$errors = validateUser(["name" => "", "age" => -5, "email" => "invalid"]);
foreach ($errors as $e) {
echo "エラー: {$e}\n";
}
実行結果
エラー: 名前は必須です
エラー: 年齢は0以上の数値です
エラー: メールアドレスの形式が不正です
andとorは避ける
and と or は代入演算子 = より優先順位が低いため、意図しない動作になりやすいです。常に && と || を使用することを強く推奨します。
ポイント
PHP 8.0以降では match 式や名前付き引数が導入され、複雑な条件分岐がより読みやすく書けるようになりました。論理演算子は基本ですが、複雑になりすぎる場合は条件を関数に切り出すことで可読性を保ちましょう。
まとめ
&&(AND)は両方true、||(OR)はどちらかtrue、!(NOT)は反転- 短絡評価により、結果が確定した時点で残りの式は評価されない
- nullチェックや存在チェックと組み合わせて安全なコードが書ける
and/orは優先順位の問題があるため&&/||を使う- バリデーションなど複数条件の判定は論理演算子の基本的な活用場面