はじめに
PHPには数値を判定する関数が複数存在します。is_int()・is_numeric()・ctype_digit()──。
一見似ていますが、挙動が異なり、特に ctype_digit() は PHP8.0と8.1以降で動作が変わる という落とし穴があります。
この記事では、実際のコード実行結果を交えながら、この3関数の違いを深掘りします。
目次
🧩 まずはおさらい:3つの関数の概要
| 関数 | 判定対象 | 返す値の意味 |
|---|---|---|
is_int($v) | データ型が整数型か | $v が int 型なら 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(制御文字)扱い → false123456→ 255を超えるので “123456” という文字列扱い → true
⚠️ PHP8.1以降では変化
PHP 8.1 以降では ctype_digit() に整数を渡したときの扱いが厳密化され、
整数をそのまま「文字列化」しないケースが増えました。
結果として、多くの環境で次のように変化します👇
| PHPバージョン | ctype_digit(123456) | 備考 |
|---|---|---|
| 8.0.0 | ✅ true | 256以上の整数は文字列扱い |
| 8.1〜8.3 | ❌ false | int型は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 に変化する点に注意!
