MENU

【PHP】データ型の種類と確認方法を解説|Webの基礎

PHPのデータ型の種類と確認方法を解説|Webの基礎
目次

はじめに

前回の記事では、変数の宣言方法や命名ルール、文字列の中に変数を埋め込む書き方を解説しました。

今回は、その変数に入る値の種類であるデータ型について解説します。PHPは型をあまり意識せずに書ける言語ですが、そのぶん「計算結果がおかしい」「trueを表示したら1になった」といった、型が原因のつまずきが起こりやすい言語でもあります。

この記事では、PHPの基本的なデータ型と、型を確認する方法、型が自動で変わる仕組みまでをまとめて整理します。

データ型とは?

データ型とは、値がどんな種類のデータなのかを表す分類のことです。同じ「10」でも、数値の10なのか、文字の"10"なのかによって、PHP内部での扱いが変わります。

この記事で扱う基本のデータ型は、次の5つです。

データ型型名値の例内容
文字列string"田中"、'abc'文字の並び
整数int30、-5、0小数点のない数
浮動小数点数float3.14、0.5小数点のある数
真偽値booltrue、false正しいか正しくないか
NULLnullnull値が何もない状態
PHPの基本データ型(文字列・整数・浮動小数点数・真偽値・NULL)の一覧図

PHPでは、変数に値を代入した時点で、その値に合わせて型が自動的に決まります。変数を作るときに型を指定する必要はありません。

<?php
    $name = "田中";   // 文字列(string)
    $age = 30;        // 整数(int)
    $height = 170.5;  // 浮動小数点数(float)
    $isMember = true; // 真偽値(bool)
    $memo = null;     // NULL

VBAでは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(長さ) “値”」の形になり、カッコ内の数字は文字列のバイト数を表します。

var_dumpの出力「string(6) "田中"」を型名・バイト数・値に分けて説明した図

"田中"は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);   // NULL

gettype()は、浮動小数点数に対して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に変換した結果
falseboolfalse
0intfalse
0.0floatfalse
""(空文字)stringfalse
"0"stringfalse
nullNULLfalse
[](空の配列)arrayfalse

上の表以外の値は、すべて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できます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!


【CSS】テキスト関連プロパティについて基本解説|Webの基礎


よかったらシェアしてね!
  • URLをコピーしました!
目次