PHPでもいろんなデータ型が定義されており、それに対応して、データ型を判定する関数が導入されています。
数値であるかを判定したいときに使うのがis_numeric関数です。
このis_numeric関数は、PHPでのデータ型の扱いの特性を反映しており、取り扱いに留意する必要があります。
ここでは、PHPでのデータ型の扱いおよびis_numeric関数を使う際の留意点を説明します。
PHPプログラミングに興味のある方は、プログラミング学習の参考として、ぜひ読んでみてください。
目次
PHPのis_numeric関数は何を判定する?
PHPにおけるデータ型
PHP は 10 種類の基本型をサポートします。
データ型 | 種類 | 説明 |
---|---|---|
論理値(bool) | スカラー型 | trueまたfalse |
整数(int) | スカラー型 | 10進数以外はプレフィックスをつける。 2進数:0b、8進数:0、16進数:0x |
浮動小数点数(float、double) | スカラー型 | 小数点数のほか、指数表現も可能。 |
文字列(string) | スカラー型 | シングルクォート(’)またはダブルクォート(”)で 囲まれた0文字以上の文字列 |
配列(array) | 複合型 | 連想配列や多次元配列も含む |
オブジェクト(object) | 複合型 | オブジェクトを定義 |
callable | 複合型 | コールバックをあらわす |
iterable | 複合型 | イテレーターをあらわす |
リソース(resource) | 特別な型 | 外部リソースへの参照 |
ヌル(null) | 特別な型 | 値なし(空)を示す |
is_numeric関数はどの型を判定する?
上記のデータ型で数値というと、整数または浮動小数点数を思い浮かべる方が多いと思います。
PHPで数値かどうかの判定をする際に思いつくのがis_numeric関数ですが、実はこの関数は整数または浮動小数点数のほか、文字列のばあいにも”numeric”であるという判定結果を返します。
例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# php -v PHP 8.0.1 (cli) (built: Jan 5 2021 23:43:39) ( ZTS Visual C++ 2019 x64 ) php > var_dump(is_numeric(12)); //整数(int)はOK bool(true) php > var_dump(is_numeric(12.3)); //浮動小数点数(float)はOK bool(true) php > var_dump(is_numeric(12.3e4)); //指数表現の浮動小数点数(float)はOK bool(true) php > var_dump(is_numeric("12.3e4")); //文字列で表された数値はOK bool(true) php > var_dump(is_numeric("12.3e4 Text")); //数値で始まる文字列はNG bool(false) php > var_dump(is_numeric(1+"12.3e4 Text")); //数値で始まる文字列を含む演算結果はOK PHP Warning: A non-numeric value encountered in php shell code on line 1 Warning: A non-numeric value encountered in php shell code on line 1 bool(true) |
データ型については以下の参考にしてください。
【初心者向け】PHPのintとは?基本概念や関連メソッドも解説しますPHPにおけるデータ型の扱いの特徴
変数の型宣言をしなくてもよい
PHPでの変数は、数値や文字列などいろんなデータを値として持つことができます。C言語やJava言語では、変数を宣言する際にその型を定義します。そして、プログラム内では、定義された型以外のデータを格納することはできません。
一方、PHPでは、変数を定義する際にはその型は不要です。つまり、変数にはどんな値でも格納できるのです。変数に文字列を入れれば変数の型はstring型になり、整数を入れればint型になります。
下記のように、変数を異なるデータ型の値で上書きすることができます。
1 2 3 |
$foo = "1"; // $fooの型 は文字列です $foo = 2; // ここでは、$fooの型 は整数となります。 $foo = 1.3; // ここでは、$fooの型 はfloat です。 |
暗黙的な型変換
PHPでは、プログラム内の各種演算処理などにおいて、必要に応じて自動で型を変換して処理してくれます。
1 2 |
$foo = 1; // $fooの型 は整数です $foo = $foo * 1.3; // 右辺の$foo はfloatに変換され、計算結果はfloatとなります。 |
すなわち、変数にセットされた値に応じて、データ型は自動的に変更されていることになります。
数値形式の文字列の扱い
PHP の 文字列では、その文字列が int や float と解釈できる場合は、文字列ではなく数値と見なされます。
1 2 |
$foo = 1 + "10"; // $fooの型は int でその値は 11 $foo = 1 + "-1.3e3"; // $fooの型は float でその値は -1299 |
数値形式の文字列から始まり、その後に任意の文字が続くときの扱いは、PHPのバージョンによって扱いが異なります。
・文字列が数値でない場合、 E_WARNING が発生し、 0 を返す。
・PHP 7.1.0 より前のバージョンでは、 E_NOTICE も E_WARNING もなし。
文字列 | PHP8.0.0以降 | それ以前 |
---|---|---|
$foo = 1 + “10 Text” | $fooの型は integer で値は11 E_WARNING |
$fooの型は integer で値は11 E_NOTICE |
$foo = 1 + “Text-1.3e3” | TypeError | $fooの型は integer で値は1 E_WARNING |
PHPにおける型の扱いのメリット・デメリット
・上記のより思わぬバグを招くリスクがある。
利便性をとるか、簡便性をとるかの問題ですが、入力を受け付けるWEBシステムにおいては、できるだけ変数の型を意識した安全なプログラム作りを優先しようという声が強いです。
正規表現を使う方は以下も参考にしてください。
【PHP】文字列を正規表現で検索する関数の使い方を解説データ型をチェックする関数
データ型をチェックする関数としては、各データ型に対応した関数is_xxx(xxxはデータ型)が用意されています。例えば、
- is_bool()関数:変数が 論理型 boolean かどうか判定する
- is_int()関数:変数が 整数型 integer かどうか判定する
- is_float()関数:変数が 浮動小数点型 float かどうか判定する
- is_string()関数:変数が 文字列型 string かどうか判定する
- is_array()関数:変数が 配列型 array かどうか判定する
プログラムで扱う型が決まっている場合には、これらの関数を使って型チェックをするとよいでしょう。
そのほか数値として扱えるものか、スカラー型のデータであるかをチェックする関数が用意されています。
is_numeric
指定した変数が数値または 数値形式の文字列であるかどうかを調べます。
1 |
is_numeric ( mixed $value ) |
パラメータ
パラメータ | 型 | 説明 |
---|---|---|
value | mixed | 評価する変数 |
返り値
- value が数値または 数値形式の文字列である場合true、それ以外の場合に false
is_scalar
指定した変数がスカラかどうかを調べます。
1 |
is_scalar ( mixed $value ) |
パラメータ
パラメータ | 型 | 説明 |
value | mixed | 評価する変数 |
返り値
- value がスカラ場合はtrue、それ以外の場合は falseを返します。
- スカラ変数には int、float、string あるいは bool が含まれます。
- array、object および resource はスカラではありません。
以下も参考にしてください。
これから学ぶ初心者必見!!プログラミング言語の違いまとめ
いかがでしたか? 今回は、PHPで数値であるかをチェックするis_numeric関数を紹介しました。
PHPでは変数のデータ型を意識することなくプログラムが書けますが、便利な反面、思わぬバグを生む原因にもなりかねません。
変数のデータ型をチェックする関数などを使ってプログラムではミスのないように気をつけましょう。
この記事が、PHPプログラミングの学習の参考としてお役に立てば幸いです。