7.

if 文の書き方(PHP / JS / Python / Java) — 三項演算子・null 合体・match まで

編集
この記事の要点
  • if 文はあらゆる言語の基本制御構造。条件を評価して true ならブロックを実行
  • PHP/JS/Java は if (cond) { ... } else if { } else { }、PHP は elseif も可
  • Python は波括弧なしでインデントによるブロック: if cond: / elif
  • 三項演算子 cond ? a : b で簡潔記述、PHP は cond ?: b(Elvis 演算子)も
  • PHP/JS: Null 合体演算子 ?? で「null なら代替値」、Java は Optional API
  • PHP 8.0+ match / Swift の guard / コードスタイルは早期 return・ガード節

各言語の if 文の書き方

PHP

$age = 20;

if ($age >= 20) {
    echo "成人";
} elseif ($age >= 13) {       // PHP は elseif と else if の両方可
    echo "ティーン";
} else {
    echo "未成年";
}

// 短縮形(テンプレート向け)
if ($age >= 20):
    echo "成人";
elseif ($age >= 13):
    echo "ティーン";
else:
    echo "未成年";
endif;

// 1 行(波括弧省略は推奨されない)
if ($age >= 20) echo "成人";

JavaScript / TypeScript

const age = 20;

if (age >= 20) {
  console.log("成人");
} else if (age >= 13) {       // JS は else if (スペース必須)
  console.log("ティーン");
} else {
  console.log("未成年");
}

// truthy/falsy 評価
const name = "";
if (name) {
  // 空文字は falsy なのでここは実行されない
} else {
  console.log("空");
}

Python

age = 20

if age >= 20:
    print("成人")
elif age >= 13:               # Python は elif
    print("ティーン")
else:
    print("未成年")

# 1 行(pythonic ではないが書ける)
if age >= 20: print("成人")

# in 演算子と組み合わせ
status = "paid"
if status in ("paid", "shipped", "delivered"):
    print("確定")

Java

int age = 20;

if (age >= 20) {
    System.out.println("成人");
} else if (age >= 13) {
    System.out.println("ティーン");
} else {
    System.out.println("未成年");
}

// Java 14+ switch 式
String label = switch (age / 10) {
    case 0, 1 -> "未成年";
    case 2, 3, 4 -> "成人";
    default -> "シニア";
};

三項演算子

言語記法
PHP / JS / Java / C / C++cond ? a : b
Pythona if cond else b
Kotlin / Scalaif (cond) a else b(式として)
Rustif cond { a } else { b }(式として)
// PHP
$label = $age >= 20 ? "成人" : "未成年";

// PHP Elvis 演算子(true なら左を返す)
$name = $input ?: "デフォルト";
// $input が truthy なら $input、そうでなければ "デフォルト"

// ネスト(読みづらいので避ける)
$label = $age >= 20 ? "成人" : ($age >= 13 ? "ティーン" : "未成年");
# Python
label = "成人" if age >= 20 else "未成年"

# ネスト
label = "成人" if age >= 20 else "ティーン" if age >= 13 else "未成年"

Null 合体演算子

// PHP 7+ Null 合体 ??
$name = $_POST['name'] ?? 'ゲスト';
// $_POST['name'] が null または未定義なら 'ゲスト'

// Null 合体代入 (PHP 7.4+)
$config['timeout'] ??= 30;  // 未設定なら 30

// 注意: 空文字 '' は null ではないので通る
$x = '' ?? 'default';   // → ''
// JS ES2020 Nullish Coalescing ??
const name = userInput ?? "ゲスト";
// userInput が null または undefined なら "ゲスト"
// "" や 0 や false は通る

// Optional Chaining ?.
const city = user?.address?.city ?? "不明";

// 代入版 (ES2021)
config.timeout ??= 30;

PHP 8.0+ match 式

switch の進化版。厳密比較 (===)、値を返せる、暗黙フォールスルー無し:

$status = 'paid';

// match (PHP 8.0+)
$label = match ($status) {
    'pending'   => '保留中',
    'paid'      => '支払済',
    'shipped'   => '出荷済',
    'cancelled' => 'キャンセル',
    default     => '不明',
};

// 複数値マッチ
$tier = match (true) {
    $age < 13           => 'kids',
    $age >= 13 && $age < 20 => 'teen',
    $age >= 20          => 'adult',
};

// 比較: 旧来の switch
switch ($status) {
    case 'paid':
        $label = '支払済';
        break;     // ← break 忘れがちなバグの温床
    default:
        $label = '不明';
}

Swift の guard

Swift には条件を満たさないときに早期 return する guard 文があります:

func loadUser(id: Int?) -> User? {
    // 条件を満たさなければ即 return
    guard let id = id, id > 0 else {
        return nil
    }
    // ここ以降では id は Int (アンラップ済)
    return User(id: id)
}

複合条件: && と ||

// && (AND) と || (OR)
if ($user !== null && $user->isActive && $user->age >= 20) {
    // すべて true のとき
}

if ($status === 'paid' || $status === 'shipped') {
    // どちらか true
}

// 短絡評価
if ($user && $user->name) {   // $user が null なら $user->name は評価されない
    echo $user->name;
}

// 演算子の優先度 (! > && > ||)
if (!$flag && $x || $y) {
    // = (!$flag && $x) || $y と解釈される
}

// 明示的に括弧
if ((!$flag && $x) || $y) { ... }

コードスタイル: 早期 return とガード節

ネストが深い if は読みづらい。異常系を先にはじいて return するスタイルが推奨されます:

// ❌ ネストが深い
function process($user) {
    if ($user !== null) {
        if ($user->isActive) {
            if ($user->age >= 20) {
                return doSomething($user);
            } else {
                return '未成年';
            }
        } else {
            return '非アクティブ';
        }
    } else {
        return 'ユーザーなし';
    }
}

// ✅ ガード節で早期 return
function process($user) {
    if ($user === null)       return 'ユーザーなし';
    if (!$user->isActive)     return '非アクティブ';
    if ($user->age < 20)      return '未成年';

    // 正常系
    return doSomething($user);
}

言語別の比較表

機能PHPJSPythonJava
elseif キーワードelseif / else ifelse ifelifelse if
三項演算子?:?:a if c else b?:
Null 合体?? (7+)?? (ES2020)or 慣用Optional API
match / switch 式match (8+)×(switch のみ)match (3.10+)switch 式 (14+)
波括弧必須必須×(インデント)必須

FAQ

Q: =====、どちらを使う
A: 型を考慮したいなら必ず ===(厳密比較)。PHP/JS の ==0 == "0"null == false が true になり事故ります。Python は == 一つだけ。

Q: 早期 return と else どちらが良い
A: 一般に早期 return(ガード節)がネストを浅くしてレビューしやすいので推奨。例外的に「分岐先が同じ重み」のときは if/else を残します。

Q: switch / match を使うべき判断基準
A: 比較対象が同じ値の等価チェックで、ケースが 3 つ以上あるなら switch/match。範囲条件(>= 20 等)は if/elseif が読みやすいです。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. Templateの使用準備
  2. Template の定義方法
  3. テンプレートの作成と共通化
  4. setting.pyにおけるテンプレートの設定
  5. テンプレートの名前の重複について
  6. 静的ファイルの読み込み
  7. if文
  8. テンプレートで定数を使用する方法
  9. aタグのhrefの記載方法