フォームから受け取った「"100"」を数値として計算したい、小数の文字列を整数にしたい——PHP ではこうした型変換(キャスト)が頻繁に出てきます。PHP は文字列と数値をある程度自動で変換してくれますが、意図しない結果やバグを避けるには、明示的に型を変える方法を知っておくのが安全です。この記事では、(int) などのキャスト演算子と intval()・floatval()・strval()・settype() といった関数の使い方、文字列から数値への変換のクセ、つまずきやすいポイントまで解説します。
目次
PHP の型変換とは
型変換とは、値の種類(型)を別の型に変えることです。たとえば文字列の "100" を整数の 100 にしたり、数値を文字列にしたりします。PHP には主に2つのやり方があります。1つは (int) のように型名をカッコで前に付けるキャスト演算子、もう1つは intval() のような変換関数です。代表的なものを一覧で見てみましょう。
| 変換先の型 | キャスト演算子 | 関数 |
|---|---|---|
| 整数(int) | (int) / (integer) | intval() |
| 浮動小数点数(float) | (float) / (double) | floatval() |
| 文字列(string) | (string) | strval() |
| 真偽値(bool) | (bool) / (boolean) | boolval() |
| 配列(array) | (array) | — |
整数への変換(int)
整数に変換するには (int) を付けるか、intval() を使います。小数を渡すと切り捨てられ、四捨五入はされません。
<?php
$a = (int) "100"; // 100(文字列 → 整数)
$b = (int) 3.9; // 3(小数は切り捨て)
$c = intval("42"); // 42(関数でも同じ結果)
文字列を整数に変換するとき、PHP は先頭から数字として読める部分だけを取り出します。途中に数字以外が現れるとそこで読み取りをやめ、数字で始まらない文字列は 0 になります。この挙動はよくハマるポイントなので、具体例で確認しておきましょう。
<?php
(int) "123abc"; // 123(数字の部分まで読む)
(int) "abc123"; // 0(数字で始まらないので0)
(int) "12.8kg"; // 12(小数点以降は別文字扱いで切り捨て)
(int) ""; // 0(空文字は0)
intval() には第2引数で基数(何進数として読むか)を指定できる、という関数ならではの特徴もあります。16進数の文字列を変換したいときなどに使います。
<?php
intval("0xFF", 16); // 255(16進数として解釈)
intval("100", 2); // 4(2進数の100 = 10進数の4)
小数への変換(float)
小数を含む数値にしたいときは (float) または floatval() を使います。整数への変換と同じく、先頭から数値として読める部分を取り出します。
<?php
(float) "3.14"; // 3.14
floatval("12.5円"); // 12.5
(float) "1,000"; // 1(カンマは区切り文字として読めない)
3つ目の例のように、桁区切りのカンマは数値として認識されません。"1,000" はカンマの前の 1 までしか読まれず、結果は 1 になります。フォームで桁区切り付きの金額を受け取る場合は、str_replace(",", "", $value) でカンマを取り除いてから変換しましょう。
文字列への変換(string)
数値を文字列にしたいときは (string) または strval() を使います。文字列を連結したり、出力したりする場面で使いますが、PHP では echo や文字列連結のときに自動変換されることも多いため、明示的に書く機会はそれほど多くありません。
<?php
$num = 2026;
$str = (string) $num; // "2026"
var_dump($str); // string(4) "2026"
$price = strval(980); // "980"
真偽値を文字列にすると、true は "1"、false は空文字 "" になる点には注意が必要です。echo false; が何も表示されないのはこのためです。
真偽値への変換(bool)
(bool) や boolval() で真偽値に変換できます。条件分岐の判定で重要なのが、どんな値が false になるかです。次の値はすべて false とみなされ、それ以外は true になります。
| false になる値 | 説明 |
|---|---|
0 / 0.0 | 整数・小数のゼロ |
"" / "0" | 空文字と、文字列の “0” |
[] | 空の配列 |
null | 未定義・null |
とくに文字列の "0" が false になる点は見落としがちです。一方で "0.0" や "false" という文字列は(空でも “0” でもないため)true になります。
<?php
var_dump((bool) "0"); // bool(false)
var_dump((bool) "0.0"); // bool(true) ← "0" 以外の文字列
var_dump((bool) "false"); // bool(true) ← 中身が "false" でも true
var_dump((bool) []); // bool(false) 空配列
settype と gettype
キャスト演算子や変換関数は変換後の新しい値を返すのに対し、settype() は変数そのものの型を直接変える関数です。第1引数に変数、第2引数に型名の文字列を渡します。現在の型を調べたいときは gettype() が使えます。
<?php
$value = "50";
gettype($value); // "string"
settype($value, "integer"); // $value 自体を整数に変える
gettype($value); // "integer"
var_dump($value); // int(50)
基本的には、元の値を残せる (int) などのキャストの方が安全で読みやすいため、まずはキャスト演算子か変換関数を使うのがおすすめです。型を完全に置き換えたい特別な場面でだけ settype() を検討するとよいでしょう。
変換結果が0になるときの原因
数値に変換したのに 0 になってしまうときは、元の文字列が数字で始まっていないことがほとんどです。全角数字("123")や、先頭にスペース以外の文字・記号が入っているケースが典型例です。
全角数字を扱う場合は、変換の前に mb_convert_kana() で半角に直しておきます。また、ユーザー入力をそのまま信用せず、変換後に is_numeric() で数値として妥当かを確認すると、不正な値の混入を防げます。「変換できたつもりが 0 だった」というバグは、入力値の中身を var_dump() で確認すると原因がつかみやすくなります。
まとめ
PHP の型変換は、キャスト演算子と変換関数の2通りで行えます。要点を整理します。
- 整数は
(int)/intval()、小数は(float)/floatval()、文字列は(string)/strval()。 - 文字列→数値は先頭から数字部分だけを読み、数字で始まらないと
0。小数は切り捨て。 - 真偽値では
0・""・"0"・[]・nullがfalse。文字列の"0"に注意。 settype()は変数自体の型を変える。型の確認はgettype()。- 変換結果が
0のときは、全角数字や先頭の文字を疑いis_numeric()で検証する。
フォーム入力を扱うときは「受け取ったら明示的に型変換する」を習慣にすると、計算ミスや比較の不具合を防げます。まずは (int) と (float) を使い分けるところから始めてみてください。