PHPでプログラミングを行う際、変数の中身が数値であるかどうかを確認する場面は非常に多くあります。
しかし、PHPには数値判定に関連する関数が複数存在し、それぞれの挙動には細かな違いがあります。
適切に使い分けができていないと、思わぬバグやセキュリティホールの原因になりかねません。
この記事では、代表的な関数であるis_numericとis_intの具体的な違いと、現場で役立つ使い分けのポイントを解説します。
is_numeric関数の特徴と動作
is_numericは、指定した変数が「数値」または「数値形式の文字列」であるかどうかを判定する関数です。
PHPは動的型付け言語であるため、Webフォームから送信されたデータは、たとえ数字であっても最初は文字列型として扱われます。
このような文字列型の数字を「数値」として正しく認識できるのが、is_numericの大きなメリットです。
具体的には、整数、浮動小数点数(小数)、指数表記などが判定の対象となります。
<?php
$val1 = 123;
$val2 = "456";
$val3 = 1.23;
$val4 = "1.23";
var_dump(is_numeric($val1)); // 整数
var_dump(is_numeric($val2)); // 数値形式の文字列
var_dump(is_numeric($val3)); // 浮動小数点
var_dump(is_numeric($val4)); // 浮動小数点形式の文字列
?>
bool(true)
bool(true)
bool(true)
bool(true)
is_numericは、型に厳格ではなく、その値が「計算に使えるかどうか」を基準に判定を下します。
そのため、ユーザーからの入力を数値として計算処理に回したい場合に非常に便利です。
is_int関数の特徴と動作
is_int(または別名のis_integer)は、変数の型が「整数型(integer)」であるかどうかを厳密に判定します。
is_numericとの最大の違いは、文字列型の数字を「false」と判定する点です。
たとえ中身が”123″という数字であっても、データ型が文字列であればis_intはtrueを返しません。
<?php
$val1 = 123;
$val2 = "123";
var_dump(is_int($val1));
var_dump(is_int($val2));
?>
bool(true)
bool(false)
このように、is_intは純粋な整数型のみを対象とするため、プログラム内部で計算結果が確実に整数であることを確認したい場合に適しています。
小数が含まれる場合や、文字列として受け取ったIDなどを判定する場合には適さないため注意が必要です。
is_numericとis_intの使い分け基準
これら2つの関数をどのように使い分けるべきか、具体的なシーン別に整理しましょう。
フォーム入力やAPIのパラメータを判定する場合
Webアプリケーションにおいて、GETやPOSTで受け取った値はすべて文字列型として扱われます。
したがって、フォームから送られてきた価格や数量が正しい数値かどうかをチェックするには、is_numericを使用するのが適切です。
ここでis_intを使ってしまうと、ユーザーが正しく入力していても、型が文字列であるためにエラーとなってしまいます。
「数字に見えるもの」を幅広く受け入れる必要がある場面では、is_numericを選びましょう。
厳格な型定義が必要なロジックの場合
一方で、システムの内部ロジックやデータベースのIDチェックなど、型が崩れるとエラーが発生する場所ではis_intが推奨されます。
特にPHP 8以降では、厳密な型検査(strict_types=1)を利用することが増えており、予期せぬ型変換を防ぐことが重要視されています。
計算処理の直前で「この変数は絶対に整数型であるべきだ」と保証したい場合には、is_intでのチェックが不可欠です。
比較表:判定結果の違い
主な入力値に対する各関数の戻り値をまとめました。
| 入力値 | is_numeric | is_int | 判定のポイント |
|---|---|---|---|
| 100 (int) | true | true | どちらも整数として認識 |
| “100” (string) | true | false | is_intは文字列を拒否 |
| 1.5 (float) | true | false | is_intは小数を拒否 |
| “1.5” (string) | true | false | is_numericは小数の文字列もOK |
| “abc” (string) | false | false | 数値ではないためどちらもfalse |
知っておきたい注意点と罠
数値判定には、いくつか注意すべき挙動が存在します。
空白を含む文字列の扱い
is_numericは、前後に空白が含まれる文字列を「数値ではない」と判定することがあります。
例えば、" 123 "のような値は、PHPのバージョンや環境によって挙動が異なる可能性があるため、事前にtrim()関数で空白を除去するのが安全です。
指数表記の受け入れ
is_numericは、"1e3"(1000を意味する指数表記)を数値として認識し、trueを返します。
ユーザー入力で純粋な「数字」のみを期待している場合、指数表記が混入すると計算結果が意図しないものになるリスクがあります。
「0から9の数字だけで構成されているか」を確認したい場合は、ctype_digit関数の使用を検討してください。
<?php
$val = "123";
if (ctype_digit($val)) {
echo "この文字列は数字のみで構成されています";
}
?>
ただし、ctype_digitは整数型の値を引数に渡すと、ASCIIコードとして解釈されるという独特の仕様があります。
そのため、ctype_digit((string)$val)のように、一度文字列にキャストしてから使用するのが一般的なテクニックです。
NULLや空文字の判定
is_numericもis_intも、nullや空文字("")に対してはfalseを返します。
未入力チェックを兼ねることはできますが、明示的にエラーメッセージを出し分ける場合は、先にempty()などで存在確認を行うのが良いでしょう。
まとめ
PHPにおける数値判定は、用途に合わせて最適な関数を選ぶことが重要です。
ユーザーからの入力値や文字列型の数字を扱いたい場合は、is_numericを使用するのが基本です。
一方で、プログラム内部で変数の型が「整数」であることを厳密に保証したい場合は、is_intを使用しましょう。
また、負の数や小数を許可したくない、あるいは数字のみの構成をチェックしたいといった特殊なケースでは、ctype_digitや正規表現によるチェックも有効な手段となります。
それぞれの関数の特性を正しく理解し、安全で堅牢なPHPプログラムの開発に役立ててください。
