はじめに
前回の記事では、変数の宣言方法や命名ルール、文字列の中に変数を埋め込む書き方を解説しました。
今回は、その変数に入る値の種類であるデータ型について解説します。PHPは型をあまり意識せずに書ける言語ですが、そのぶん「計算結果がおかしい」「trueを表示したら1になった」といった、型が原因のつまずきが起こりやすい言語でもあります。
この記事では、PHPの基本的なデータ型と、型を確認する方法、型が自動で変わる仕組みまでをまとめて整理します。
データ型とは?
データ型とは、値がどんな種類のデータなのかを表す分類のことです。同じ「10」でも、数値の10なのか、文字の"10"なのかによって、PHP内部での扱いが変わります。
この記事で扱う基本のデータ型は、次の5つです。
| データ型 | 型名 | 値の例 | 内容 |
|---|---|---|---|
| 文字列 | string | "田中"、'abc' | 文字の並び |
| 整数 | int | 30、-5、0 | 小数点のない数 |
| 浮動小数点数 | float | 3.14、0.5 | 小数点のある数 |
| 真偽値 | bool | true、false | 正しいか正しくないか |
| NULL | null | null | 値が何もない状態 |

PHPでは、変数に値を代入した時点で、その値に合わせて型が自動的に決まります。変数を作るときに型を指定する必要はありません。
<?php
$name = "田中"; // 文字列(string)
$age = 30; // 整数(int)
$height = 170.5; // 浮動小数点数(float)
$isMember = true; // 真偽値(bool)
$memo = null; // NULLVBAではDim age As Longのように変数の型を宣言し、宣言した型と違う値を入れようとするとエラーになりました。PHPの変数は型を固定しないため、同じ変数に数値を入れた後で文字列を入れ直すこともできます。VBAでいえば、すべての変数がVariant型のようなイメージです。
データ型を確認する方法
変数の中身がどの型になっているかは、画面を見ただけでは分かりません。型を確認したいときは、次の関数を使います。
var_dump():型と値をまとめて表示する
var_dump()は、値の型・長さ・中身をまとめて表示する関数です。PHPで型を調べるときに最もよく使います。
<?php
var_dump("田中"); // string(6) "田中"
var_dump(30); // int(30)
var_dump(170.5); // float(170.5)
var_dump(true); // bool(true)
var_dump(null); // NULL出力は「型名(値)」の形で表示されます。文字列の場合だけは「string(長さ) “値”」の形になり、カッコ内の数字は文字列のバイト数を表します。

"田中"は2文字ですが、var_dump()ではstring(6)と表示されます。UTF-8では日本語1文字が3バイトで表されるため、2文字×3バイト=6バイトになるためです。文字数として数えたい場合は、mb_strlen()関数を使います。
gettype():型名だけを文字列で取得する
gettype()は、型名を文字列として返す関数です。echoと組み合わせて使います。
<?php
echo gettype("田中"); // string
echo gettype(30); // integer
echo gettype(170.5); // double
echo gettype(true); // boolean
echo gettype(null); // NULLgettype()は、浮動小数点数に対してfloatではなくdoubleを返します(歴史的な理由による名前の違いで、中身は同じです)。整数もintではなくintegerと表示されます。型名をvar_dump()と同じ表記で取得したい場合は、PHP 8から使えるget_debug_type()を使うとint・float・bool・nullのように返ります。
普段の動作確認では、型と値を一度に見られるvar_dump()を使うのがおすすめです。
文字列型(string)
文字列は、ダブルクォート(")またはシングルクォート(')で囲んだ文字の並びです。
<?php
$city = "東京";
$code = '1234';
var_dump($city); // string(6) "東京"
var_dump($code); // string(4) "1234"'1234'のように数字だけで構成されていても、クォートで囲めば文字列型になります。見た目は数値でも型は違う、という点がこの後の「型の自動変換」につながるので覚えておいてください。
ダブルクォートとシングルクォートの違い(変数が展開されるかどうか)は、前回の記事で解説したとおりです。
数値型:整数(int)と浮動小数点数(float)
PHPの数値には、小数点のない整数(int)と、小数点のある浮動小数点数(float)の2種類があります。
<?php
$count = 12; // int
$rate = 0.08; // float
$minus = -300; // int(マイナスも整数)
$price = 1000.0; // float(.0が付くとfloatになる)
var_dump($count); // int(12)
var_dump($rate); // float(0.08)
var_dump($price); // float(1000)1000.0のように小数点以下が0でも、小数点を付けて書いた時点でfloat型になります。
割り算の結果はfloatになることがある
整数どうしの計算でも、割り切れない割り算の結果はfloat型になります。
<?php
var_dump(10 / 2); // int(5)
var_dump(10 / 3); // float(3.3333333333333335)浮動小数点数の計算誤差に注意
浮動小数点数は、コンピュータの内部で2進数として近似的に表されるため、計算結果にわずかな誤差が出ることがあります。
<?php
var_dump(0.1 + 0.2); // float(0.30000000000000004)
var_dump(0.1 + 0.2 == 0.3); // bool(false)echo 0.1 + 0.2;と書くと表示上は0.3になりますが、内部の値はぴったり0.3ではありません。そのため、比較すると「等しくない(false)」という結果になります。
金額の計算などで誤差が困る場合は、「円単位の整数で計算する」「round()関数で四捨五入してから比較する」といった方法で対処します。これはPHPに限らず、JavaScriptやExcelでも起こる現象です。
真偽値(bool)
真偽値は、true(正しい)とfalse(正しくない)の2つの値だけを持つ型です。「会員かどうか」「在庫があるかどうか」のような、2択の状態を表すときに使います。
<?php
$isMember = true;
$inStock = false;
var_dump($isMember); // bool(true)
var_dump($inStock); // bool(false)真偽値は、PHP-07で解説予定のif文による条件分岐で活躍する型です。
echoで表示すると「1」と「空文字」になる
真偽値で初心者がつまずきやすいのが、echoで表示したときの結果です。
<?php
echo true; // 1
echo false; // (何も表示されない)echoは値を文字列に変換して表示するため、trueは"1"、falseは""(空の文字列)に変換されます。「falseを表示したのに何も出ない」のは不具合ではなく、この変換によるものです。真偽値の中身を確認したいときは、echoではなくvar_dump()を使ってください。
NULL(値がない状態)
NULLは、変数に値が何も入っていない状態を表す特別な型です。取り得る値はnullの1つだけです(大文字・小文字は区別されずNULLと書いても同じです)。
<?php
$memo = null;
var_dump($memo); // NULL
echo $memo; // (何も表示されない)NULLは、次のような場面で登場します。
- 変数に明示的に
nullを代入したとき - 値を返さない関数の戻り値を受け取ったとき
- データベースから取得した値が空だったとき(データベース編で扱う予定です)
変数がNULLかどうかを調べたいときは、is_null()関数を使います。
<?php
$memo = null;
var_dump(is_null($memo)); // bool(true)is_null()のほかにも、is_string()・is_int()・is_float()・is_bool()のように、特定の型かどうかをtrue/falseで返す関数が用意されています。
型の自動変換とキャスト
計算のときは型が自動で変換される
PHPでは、型の違う値どうしを計算すると、計算できる型へ自動的に変換してくれます。これを型の自動変換(型の相互変換)と呼びます。
<?php
var_dump("10" + 5); // int(15)
var_dump("1.5" + 1); // float(2.5)
var_dump(10 . "個"); // string(5) "10個""10"は文字列ですが、+で計算する際に数値の10として扱われ、結果はint(15)になります。逆に、ピリオド(.)で連結すると数値の10が文字列に変換され、"10個"という文字列になります(日本語の「個」が3バイトなので、長さは5です)。
数値として解釈できない文字列を計算に使うと、PHP 8以降ではエラーになります。たとえば"abc" + 1はUnsupported operand typesというTypeErrorで処理が止まります。また"10abc" + 1のように先頭だけが数字の文字列は、11として計算されますが警告(Warning)が表示されます。
キャストで型を明示的に変換する
自動変換に任せず、自分で型を指定して変換することもできます。これをキャストと呼び、値の前に(型名)を付けて書きます。
<?php
var_dump((int)"123"); // int(123)
var_dump((int)"12.7"); // int(12)(小数点以下は切り捨て)
var_dump((int)"abc"); // int(0)(数値にできない場合は0)
var_dump((float)"3.14"); // float(3.14)
var_dump((string)100); // string(3) "100"
var_dump((bool)1); // bool(true)(int)"12.7"は四捨五入ではなく切り捨てになる点に注意してください。
boolに変換するとfalseになる値
(bool)でキャストしたときや、PHP-07で扱うif文の条件として使ったときにfalseとみなされる値は決まっています。
| 値 | 型 | boolに変換した結果 |
|---|---|---|
false | bool | false |
0 | int | false |
0.0 | float | false |
""(空文字) | string | false |
"0" | string | false |
null | NULL | false |
[](空の配列) | array | false |
上の表以外の値は、すべてtrueになります。特に、"0"はfalse、"false"(文字列)はtrueという点は間違えやすいので注意してください。
<?php
var_dump((bool)"0"); // bool(false)
var_dump((bool)"false"); // bool(true)(中身がある文字列なのでtrue)自動変換は比較のときにも起こります。たとえば"10" == 10は、型が違ってもtrueになります。型まで含めて比較したい場合は===を使います。この違いは、次回の「演算子」の記事で詳しく解説します。
実務サンプル(フォームから届いた値で合計金額を計算する)
Webフォームから送信された値は、入力欄に数字を入れたとしても、PHPにはすべて文字列として届きます。ここでは、フォームから受け取った数量と単価を想定して、合計金額を計算してみましょう(フォームから値を受け取る方法そのものは、第2弾の「Webフォーム処理」で解説予定です)。
<?php
// フォームから届いた値(どちらも文字列)を想定
$inputPrice = "1200";
$inputQuantity = "3";
var_dump($inputPrice); // string(4) "1200"
var_dump($inputQuantity); // string(1) "3"
// キャストで整数に変換してから計算する
$price = (int)$inputPrice;
$quantity = (int)$inputQuantity;
$total = $price * $quantity;
var_dump($total); // int(3600)
echo "合計金額は" . number_format($total) . "円です。";実行結果は次のようになります。
string(4) "1200"
string(1) "3"
int(3600)
合計金額は3,600円です。
"1200" * "3"のまま計算しても自動変換で3600になりますが、(int)で明示的に変換しておくと、「ここで数値として扱っている」という意図がコードから読み取れるようになります。また、number_format()は数値を3桁区切りの文字列に変換する関数で、金額表示によく使います。
よくある質問・エラー対処
Q. echo false;と書いたのに何も表示されません
→ echoではfalseが空の文字列に変換されるため、何も表示されないのが正しい動作です。値を確認したいときはvar_dump(false);を使うとbool(false)と表示されます。
Q. var_dump()で日本語の文字列の長さが文字数より多く表示されます
→ var_dump()が表示する長さはバイト数です。UTF-8の日本語は1文字3バイトなので、文字数の3倍の数字になります。文字数を数えたい場合はmb_strlen()を使ってください。
Q. Unsupported operand typesというエラーが出ます
→ 数値として解釈できない文字列や、配列などの計算できない値を+や*で計算しようとしたときに表示されます。var_dump()で計算に使っている変数の型と中身を確認してください。
Q. gettype()でdoubleと表示されました。floatとは違う型ですか?
→ 同じ型です。gettype()は歴史的な理由から、浮動小数点数をdoubleという名前で返します。
おわりに(まとめ)
データ型を意識できるようになると、「なぜこの結果になるのか」が分かるようになります。
- ✅ PHPの基本データ型は文字列・整数・浮動小数点数・真偽値・NULL
- ✅ 型は代入した値によって自動的に決まる
- ✅ 型を確認するときはvar_dump()が便利
- ✅ echoで表示するとtrueは1、falseは空文字になる
- ✅ 浮動小数点数の計算にはわずかな誤差が出ることがある
- ✅ 計算時は型が自動変換され、(int)などのキャストで明示的にも変換できる
次回は、計算や比較に使う「演算子」について解説します。
次回は、算術演算子・比較演算子・論理演算子など、PHPの演算子について解説予定です。今回少し触れた==と===の違いも詳しく取り上げます。
この記事が、少しでも誰かのお役に立てれば幸いです。
関連記事
当サイトの記事で使用したVBAなどのサンプルをDLできます
この記事のサンプルはありません!
ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!

