《PHP8上級試験対策》PHPの数値判定関数3兄弟を徹底比較:is_int / is_numeric / ctype_digit の微妙な違い(PHP8.0対応)

  • URLをコピーしました!

はじめに

PHPには数値を判定する関数が複数存在します。
is_int()is_numeric()ctype_digit()──。
一見似ていますが、挙動が異なり、特に ctype_digit()PHP8.0と8.1以降で動作が変わる という落とし穴があります。
この記事では、実際のコード実行結果を交えながら、この3関数の違いを深掘りします。

キーワード: is_int / is_numeric / ctype_digit / PHP8.0 / 数値判定 / 型の違い / ASCIIコード

目次

🧩 まずはおさらい:3つの関数の概要

関数判定対象返す値の意味
is_int($v)データ型が整数型か$vint 型なら true
is_numeric($v)数値または数値文字列か"123", "12.3", 123 など
ctype_digit($v)数字だけで構成された文字列"123" はOK、123 は注意!

💻 検証コード

<?php
declare(strict_types=1);
error_reporting(-1);

$fn = function(mixed $v){
    var_dump($v);
    $r = is_int($v);
    var_dump($r);
    $r = is_numeric($v);
    var_dump($r);
    $r = ctype_digit($v);
    var_dump($r);
};

$fn(123456);
$fn('123456');
$fn(12);

🧩 実行結果(PHP 8.0.0)

int(123456)
bool(true)
bool(true)
bool(true)
string(6) "123456"
bool(false)
bool(true)
bool(true)
int(12)
bool(true)
bool(true)
bool(false)

🔍 分析:なぜ ctype_digit(123456) が true になるのか?

実は ctype_digit() の仕様は少し特殊です。

⚙️ PHPマニュアル(8.0.0時点)より抜粋:
-128〜255までの整数は「1文字のASCIIコード」として扱い、
それ以外の整数値は「10進数を含む文字列」とみなす。

つまり、

  • 12 → 255以下なので ASCII文字コード#12(制御文字)扱い → false
  • 123456 → 255を超えるので “123456” という文字列扱い → true

⚠️ PHP8.1以降では変化

PHP 8.1 以降では ctype_digit() に整数を渡したときの扱いが厳密化され、
整数をそのまま「文字列化」しないケースが増えました。

結果として、多くの環境で次のように変化します👇

PHPバージョンctype_digit(123456)備考
8.0.0✅ true256以上の整数は文字列扱い
8.1〜8.3❌ falseint型はASCII評価のまま

📘 各関数の使い分けまとめ

目的推奨関数理由
「整数型」か確認したいis_int()型チェックのみ
「数値として扱える文字列」も許可したいis_numeric()"12.3" もOK
「整数文字列だけ」許可したいctype_digit() + is_string()"123"のみOK

🧭 図解イメージ

┌───────────────────────────────────────────────────────────────┐
│           PHPの数値判定3関数の関係図                              │
├──────────────┬──────────────────────────┬─────────────────────┤
│   is_int()   │  is_numeric()            │  ctype_digit()      │
├──────────────┼──────────────────────────┼───────────────────-─┤
│ 型が int か? │ 数値として解釈できるか?      │ 文字列が数字だけか?   │
├──────────────┼──────────────────────────┼─────────────────────┤
│ ✅ 123        │ ✅ 123                   │ ❌ 123              │
│ ❌ '123'      │ ✅ '123'                 │ ✅ '123'            │
│ ❌ '12.3'     │ ✅ '12.3'                │ ❌ '12.3'           │
│ ❌ 'abc'      │ ❌ 'abc'                 │ ❌ 'abc'            │
└──────────────┴───────────────────────────┴────────────────────┘

🪄 まとめ

  • is_int() は「」をチェック
  • is_numeric() は「数値として扱えるか」をチェック
  • ctype_digit() は「数字文字列かどうか」をチェック
  • PHP 8.0 では ctype_digit(123456)true になるが、PHP 8.1以降では false に変化する点に注意!

この記事が気に入ったら
いいねしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次