19.

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 ?? 'デフォルト' のように。空文字 '' は通します。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. プラットホーム
  2. 環境構築
  3. 文法
  4. API
  5. Servlet(サーブレット)
  6. JSP
  7. Applet(アプレット)
  8. デザインパターン
  9. フレームワーク
  10. ライブラリ
  11. Androidアプリケーション
  12. Project Jigsaw
  13. エラー一覧
  14. 日付の加算、減算
  15. 文字列の数字チェック
  16. 改行コードの削除
  17. 先頭と末端の文字の削除
  18. warファイルの中身を確認する方法
  19. nullもしくは空文字の判定
  20. beanの中身を確認する方法
  21. org.apache.log4j.Logger のログ出力で printStackTrace() のエラー内容を出力する方法
  22. Javaのバージョン確認方法