この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: nullもしくは空文字の判定
SEOタイトル: PHP で「null または空文字」を判定する 5 つの方法と落とし穴

この記事の要点
  • PHP で「null または空文字」を判定する定番: $x === null || $x === '' または !isset($x) || $x === ''
  • empty()0 / "0" / false / [] も true → 「未入力」判定には危険
  • is_null() は null だけ、空文字は別途チェック
  • strlen($x) === 0 は null に対し PHP 8.1+ で警告(null 渡し非推奨)
  • 推奨: 厳密に「未入力」を見たいなら $x === null || $x === ''、緩く見たいなら empty($x)(数値 0 を有効にしたいときは empty 禁止)

結論: 安全な判定パターン

// ✅ 推奨1: 明示的に「null または空文字」
function isNullOrEmpty($x): bool {
    return $x === null || $x === '';
}

// ✅ 推奨2: 未定義キー対応($_POST['name'] 等)
function isInputEmpty(array $data, string $key): bool {
    return !isset($data[$key]) || $data[$key] === '';
}

// 使用例
$name = $_POST['name'] ?? null;
if (isNullOrEmpty($name)) {
    echo '名前を入力してください';
}

各判定関数の比較

判定null'''0'0false[]未定義
empty($x)truetruetruetruetruetruetrue
is_null($x)truefalsefalsefalsefalsefalse警告
isset($x)falsetruetruetruetruetruefalse
$x === nulltruefalsefalsefalsefalsefalse警告
$x === ''falsetruefalsefalsefalsefalse警告
strlen($x) === 0警告truefalsefalsetrueエラー警告

empty() の落とし穴

「空チェックは empty で」と覚えると、数値 0 や文字列 "0" まで「空」扱いされる事故が起きます:

// ❌ よくあるバグ
$age = $_POST['age'] ?? null;
if (empty($age)) {
    echo '年齢を入力してください';
    // → 0 歳の赤ちゃんを登録できない!
}

// ❌ 同じく
$score = 0;
if (empty($score)) {
    // → score = 0 が「入力されていない」扱い
}

// ✅ 修正: 厳密判定
if ($age === null || $age === '') {
    echo '年齢を入力してください';
}

未定義キーへのアクセス(PHP 8.1+ 警告)

PHP 8.1 以降では strlen(null) 等で「Passing null to parameter of type string is deprecated」警告が出ます:

// ❌ PHP 8.1+ で警告
$name = null;
if (strlen($name) === 0) { ... }
// → Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated

// ✅ Null Coalescing で対処
if (strlen($name ?? '') === 0) { ... }

// ✅ または直接判定
if ($name === null || $name === '') { ... }

// 配列キー未定義の場合
$data = ['name' => 'taro'];

// ❌ Warning: Undefined array key "age"
if (empty($data['age'])) { ... }

// ✅ Null Coalescing
$age = $data['age'] ?? null;
if ($age === null || $age === '') { ... }

用途別の推奨判定

判定したいこと推奨
フォームの未入力(数値 0 / "0" は有効)$x === null || $x === ''
配列に値が存在しないこと!isset($arr['key'])
変数が null か$x === null
空配列か$x === [] or count($x) === 0
「ゆるく」空(0 / false / "" / [] 全部空扱い)empty($x)
空白だけの文字列も空扱いtrim($x ?? '') === ''

「空白だけの文字列」も空扱いにする

function isBlank(?string $x): bool {
    return $x === null || trim($x) === '';
}

// 全角スペース・タブも空扱いにする場合
function isBlankFullwidth(?string $x): bool {
    if ($x === null) return true;
    // 半角・全角スペース、タブ、改行を除去
    $cleaned = preg_replace('/[\s\x{3000}]+/u', '', $x);
    return $cleaned === '';
}

isBlank('   ');       // true
isBlank("\n\t");      // true
isBlankFullwidth('  '); // true

Laravel での書き方

use Illuminate\Support\Str;

// blank() : null / '' / 空白文字列 / [] が true
if (blank($name)) {
    return back()->withErrors('名前必須');
}

// filled() : blank の逆
if (filled($name)) {
    // ...
}

// バリデーション (推奨)
$request->validate([
    'name' => 'required|string|max:255',  // null / '' / 未送信 をはじく
]);

FAQ

Q: $x == null$x === null、どちらを使うべき?
A: 必ず ===(厳密比較)。==0"" も null と等価扱いされて事故ります。

Q: !$x ではダメ?
A: !0!""!null も全部 true なので、empty と同じ問題が起きます。明示的判定を推奨。

Q: ヌル合体演算子 ?? はどう使う?
A: 「null なら代替値」専用。$name = $input ?? 'デフォルト' のように。空文字 '' は通します。