PHPのデータ型とは、変数や値が「どの種類のデータなのか」を表す分類のことです。
たとえば、次のようなコードを見てみましょう。
$price = 100;
$name = "100";
$isPublished = true;
一見すると、100 と "100" は似ています。
しかし、PHPではまったく同じものではありません。
$price = 100; // 整数
$name = "100"; // 文字列
100 は数値として計算に使える値です。
一方、"100" は文字として扱われる値です。
このように、PHPでは値ごとに「整数なのか」「文字列なのか」「真偽値なのか」「配列なのか」といった種類があります。この種類を表すものがデータ型です。
データ型を理解すると、PHPのコードをより正確に読めるようになります。
また、意図しない型変換や比較ミスによるバグも防ぎやすくなります。
PHPでよく使う主なデータ型
PHPで最初に覚えておきたい代表的なデータ型は、以下のとおりです。
| データ型 | 内容 | 例 |
|---|---|---|
int | 整数 | 100, -20, 0 |
float | 小数 | 3.14, 0.5 |
string | 文字列 | "こんにちは", "100" |
bool | 真偽値 | true, false |
array | 配列 | [1, 2, 3] |
object | オブジェクト | new User() |
null | 値がない状態 | null |
resource | 外部リソースへの参照 | fopen() の戻り値など |
ただし、PHPの型はこれだけではありません。
関数やメソッドの型宣言では、mixed、void、never、callable、iterable、クラス名、インターフェース名、Enumなども使われます。
まずは基本型を理解し、そのあとで型宣言に使う型を学んでいくとよいでしょう。
整数型:int
intとは
int は、整数を表すデータ型です。
小数点を含まない数値は、基本的に int として扱われます。
$age = 30;
$count = 10;
$price = 1980;
$minus = -5;
var_dump() を使うと、値の型を確認できます。
$age = 30;
var_dump($age);
出力例は次のとおりです。
int(30)
intが使われる場面
int は、以下のような値に使われます。
$userId = 1;
$page = 2;
$stock = 50;
$price = 2980;
Web制作やアプリ開発では、ユーザーID、商品ID、ページ番号、在庫数、価格などでよく使います。
ただし、見た目が数値でも、クォートで囲まれている場合は文字列です。
$a = 100; // int
$b = "100"; // string
この違いは、比較や計算をするときに重要になります。
浮動小数点数型:float
floatとは
float は、小数を含む数値を表すデータ型です。
$height = 170.5;
$taxRate = 0.1;
$average = 86.7;
var_dump() で確認すると、次のように表示されます。
$taxRate = 0.1;
var_dump($taxRate);
float(0.1)
floatが使われる場面
float は、以下のような値に使われます。
$rate = 0.08;
$averageScore = 72.5;
$latitude = 35.681236;
税率、割合、平均値、座標、身長、体重など、小数を扱う場面で使います。
金額計算ではfloatに注意する
float は便利ですが、金額計算には注意が必要です。
コンピューターの小数計算では、見た目どおりに正確な値を表現できない場合があります。
echo 0.1 + 0.2;
この結果は、内部的には 0.30000000000000004 のような誤差を含むことがあります。
そのため、ECサイトや決済処理などで金額を扱う場合は、小数ではなく整数で管理する方法がよく使われます。
$priceYen = 1000; // 1000円
$priceCents = 1999; // 19.99ドルをセントで管理
日本円なら「円」、ドルなら「セント」のように、最小単位で整数管理すると誤差を避けやすくなります。
文字列型:string
stringとは
string は、文字列を表すデータ型です。
$name = "田中";
$email = "test@example.com";
$message = "こんにちは";
文字列は、シングルクォート ' またはダブルクォート " で囲みます。
$text1 = 'こんにちは';
$text2 = "こんにちは";
シングルクォートとダブルクォートの違い
シングルクォートとダブルクォートには違いがあります。
ダブルクォートでは、文字列の中で変数を展開できます。
$name = "田中";
echo "こんにちは、{$name}さん";
出力は次のようになります。
こんにちは、田中さん
一方、シングルクォートでは、基本的に変数は展開されません。
$name = "田中";
echo 'こんにちは、{$name}さん';
出力は次のようになります。
こんにちは、{$name}さん
変数を埋め込みたい場合はダブルクォート、単純な文字列として扱いたい場合はシングルクォート、というように使い分けるとよいでしょう。
stringの長さは文字数ではなくバイト数
var_dump() で日本語文字列を確認すると、次のように表示されることがあります。
$value = "こんにちは";
var_dump($value);
出力例です。
string(15) "こんにちは"
ここで表示されている 15 は、文字数ではありません。
基本的にはバイト数です。
「こんにちは」は5文字ですが、UTF-8では日本語1文字が3バイトになることが多いため、5文字 × 3バイト = 15バイト になります。
PHPで日本語を扱う場合、この「文字数」と「バイト数」の違いは重要です。
真偽値型:bool
boolとは
bool は、真偽値を表すデータ型です。
値は次の2つだけです。
true
false
たとえば、次のように使います。
$isLogin = true;
$isAdmin = false;
$isPublished = true;
boolが使われる場面
bool は、条件分岐でよく使われます。
$isLogin = true;
if ($isLogin) {
echo "ログイン済みです";
} else {
echo "ログインしてください";
}
以下のように、状態を表す変数として使うことが多いです。
$isPublished = true; // 公開済みか
$isDeleted = false; // 削除済みか
$hasError = true; // エラーがあるか
falseとして扱われる値に注意する
PHPでは、if の中でさまざまな値が true または false のように評価されます。
特に、以下の値は false として扱われることがあります。
false
0
0.0
""
"0"
[]
null
注意したいのは、文字列の "0" です。
$value = "0";
if ($value) {
echo "trueです";
} else {
echo "falseです";
}
PHPでは、"0" は false 的に扱われます。
そのため、フォーム入力や検索条件などで "0" を有効な値として扱いたい場合は注意が必要です。
配列型:array
arrayとは
array は、複数の値をまとめて扱うデータ型です。
$fruits = ["apple", "banana", "orange"];
配列の値は、キーを使って取り出します。
echo $fruits[0]; // apple
echo $fruits[1]; // banana
PHPの配列は、単なるリストだけではなく、キーと値を持つマップのようにも使えます。
インデックス配列
インデックス配列とは、数値のキーで値を管理する配列です。
$colors = ["red", "blue", "green"];
echo $colors[0]; // red
echo $colors[1]; // blue
記事一覧、商品一覧、カテゴリー一覧など、リスト形式のデータに向いています。
$posts = ["記事1", "記事2", "記事3"];
連想配列
連想配列とは、文字列などのキーを使って値を管理する配列です。
$user = [
"name" => "田中",
"age" => 30,
"email" => "tanaka@example.com"
];
echo $user["name"]; // 田中
echo $user["email"]; // tanaka@example.com
実務では、連想配列は非常によく使われます。
たとえば、商品情報は次のように表せます。
$product = [
"id" => 1,
"name" => "Tシャツ",
"price" => 2980,
"in_stock" => true
];
この配列には、int、string、bool など、複数の型が含まれています。
PHPの配列は柔軟な構造を持つ
PHPの配列では、数値キーと文字列キーを混ぜることもできます。
$data = [
0 => "apple",
"name" => "田中",
10 => "banana",
];
この柔軟さは便利ですが、構造が複雑になりすぎると読みづらくなります。
実務では、配列の中にどのようなキーが入り、どのような型の値が入るのかを意識して使うことが大切です。
オブジェクト型:object
objectとは
object は、クラスから作られるデータです。
class User
{
public string $name;
public int $age;
}
$user = new User();
$user->name = "田中";
$user->age = 30;
この $user は、User クラスのオブジェクトです。
var_dump($user);
出力例です。
object(User)#1 (2) {
["name"]=>
string(6) "田中"
["age"]=>
int(30)
}
objectはデータと処理をまとめられる
配列はデータをまとめるときに便利です。
一方、オブジェクトはデータだけでなく、そのデータに関係する処理も一緒に持てます。
class User
{
public string $name;
public function sayHello(): string
{
return "こんにちは、{$this->name}さん";
}
}
$user = new User();
$user->name = "田中";
echo $user->sayHello();
出力は次のようになります。
こんにちは、田中さん
LaravelやSymfonyなどのフレームワークでは、オブジェクト指向の考え方が多く使われます。
WordPressでも、処理によってはオブジェクトが登場します。
null型
nullとは
null は、値が存在しないことを表す型です。
$value = null;
たとえば、まだ値が決まっていない場合に使います。
$selectedUser = null;
データベースからデータを取得しようとして、該当するデータがなかった場合にも null が使われることがあります。
$user = findUserById(999);
if ($user === null) {
echo "ユーザーが見つかりません";
}
null、空文字、0の違い
null、空文字 ""、数値の 0 は、それぞれ意味が違います。
$a = null; // 値がない
$b = ""; // 空の文字列
$c = 0; // 数値のゼロ
| 値 | 意味 |
|---|---|
null | 値が存在しない |
"" | 文字列はあるが中身が空 |
0 | 数値としてゼロ |
false | 真偽値として偽 |
[] | 配列だが要素がない |
フォーム入力では、この違いが重要です。
$name = "";
これは「入力欄はあるが、何も入力されていない」と考えられます。
一方で、
$name = null;
これは「そもそも値が渡ってきていない」と考えられます。
null と空文字を区別できるようになると、フォーム処理やデータベース処理でバグを減らしやすくなります。
リソース型:resource
resourceとは
resource は、外部リソースへの参照を表す特殊な型です。
たとえば、ファイル操作で使われます。
$file = fopen("sample.txt", "r");
この $file は、ファイルを操作するためのリソースです。
var_dump($file);
出力例です。
resource(5) of type (stream)
resourceの重要度
resource は、ファイル、画像処理、一部のデータベース接続などで使われることがあります。
ただし、現代のPHPでは、以前は resource を返していた一部の機能が、object を返すようになっているケースもあります。
そのため、resource は自分で積極的に設計する型というより、PHPの関数や拡張機能を使っているときに出会う型と考えるとよいでしょう。
PHPは動的型付けの言語
変数に型を書かなくても使える
PHPは、変数に型を明示しなくても使える言語です。
$value = 100;
$value = "こんにちは";
$value = true;
このように、同じ変数に別の型の値を代入することもできます。
$value = 100; // int
$value = "100"; // string
$value = ["100"]; // array
PHPは、変数に入っている値をもとに、実行時に型を判断します。
この特徴を動的型付けといいます。
動的型付けのメリットと注意点
動的型付けのメリットは、コードをシンプルに書きやすいことです。
$name = "田中";
$age = 30;
毎回、変数の型を細かく宣言しなくても書けます。
一方で、型を意識しないと、意図しないバグにつながります。
$a = 100;
$b = "100";
この2つは見た目が似ていますが、$a は int、$b は string です。
そのため、PHPでは「今この値はどの型なのか」を意識することが大切です。
PHPの型変換
型変換とは
型変換とは、ある型の値を別の型として扱うことです。
PHPでは、必要に応じて自動的に型が変換されることがあります。
$a = "10";
$b = 5;
echo $a + $b;
出力は次のようになります。
15
"10" は文字列ですが、計算の場面では数値として扱われます。
このようなPHPの自動的な型変換は便利ですが、思わぬバグの原因にもなります。
数値に見える文字列に注意する
次のような値は、見た目は数値ですが文字列です。
$value = "100";
計算に使う場合は、明示的に整数へ変換すると安全です。
$value = "100";
$number = (int) $value;
echo $number + 50;
また、ユーザー入力を数値として扱う場合は、いきなり計算に使うのではなく、バリデーションしてから変換するのが安全です。
$input = $_POST['price'] ?? '';
if (filter_var($input, FILTER_VALIDATE_INT) === false) {
echo '整数を入力してください';
exit;
}
$price = (int) $input;
型キャスト
型キャストとは
型キャストとは、値の型を明示的に変換することです。
$value = "123";
$number = (int) $value;
主な型キャストには、次のようなものがあります。
| キャスト | 意味 |
|---|---|
(int) | 整数に変換 |
(float) | 小数に変換 |
(string) | 文字列に変換 |
(bool) | 真偽値に変換 |
(array) | 配列に変換 |
(object) | オブジェクトに変換 |
型キャストの例
$value = "123";
var_dump((int) $value);
var_dump((float) $value);
var_dump((string) $value);
var_dump((bool) $value);
フォームやURLパラメータから受け取った値を数値として使う場合は、型キャストを使うことがあります。
$page = isset($_GET["page"]) ? (int) $_GET["page"] : 1;
ただし、型キャストは「何でも安全に変換してくれる魔法」ではありません。
たとえば、"abc" を (int) で変換すると、期待した数値にはなりません。
$value = "abc";
var_dump((int) $value);
そのため、ユーザー入力を扱う場合は、キャストの前に入力値の確認をすることが大切です。
== と === の違い
== は値を比較する
PHPでは、== を使うと値が等しいかを比較できます。
var_dump(10 == "10");
出力は次のようになります。
bool(true)
10 は整数、"10" は文字列です。
しかし、== ではPHPが型を変換して比較するため、等しいと判定されます。
=== は値と型を比較する
=== を使うと、値だけでなく型も比較します。
var_dump(10 === "10");
出力は次のようになります。
bool(false)
10 は int、"10" は string なので、型が違います。
そのため、=== では false になります。
実務では厳密比較を使う
実務では、基本的に === と !== を使う方が安全です。
if ($value === null) {
echo "値がありません";
}
このように書けば、0、""、false と null を混同しにくくなります。
特に注意したいのは、次のような値です。
0
"0"
""
false
null
[]
これらは緩い比較では思わぬ結果になることがあります。
empty関数の注意点
emptyとは
empty() は、値が空かどうかを判定する関数です。
$value = "";
if (empty($value)) {
echo "空です";
}
便利な関数ですが、判定される範囲が広い点に注意が必要です。
emptyで空と判定される値
empty() では、以下のような値が空と判定されます。
""
0
"0"
null
false
[]
特に注意したいのが、文字列の "0" です。
$value = "0";
if (empty($value)) {
echo "空です";
}
この場合、"0" も空として扱われます。
フォーム処理での注意点
数量や番号を入力するフォームでは、0 が有効な値になることがあります。
悪い例です。
$quantity = $_POST['quantity'] ?? '';
if (empty($quantity)) {
echo '数量を入力してください';
}
この場合、ユーザーが 0 を入力したときにも「未入力」と判定される可能性があります。
より安全に書くなら、次のように具体的に比較します。
$quantity = $_POST['quantity'] ?? null;
if ($quantity === null || $quantity === '') {
echo '数量を入力してください';
}
empty() は便利ですが、「何を空とみなすのか」を明確にしたうえで使うことが大切です。
型を確認する方法
var_dumpを使う
PHPで型を確認するときによく使うのが var_dump() です。
$value = "こんにちは";
var_dump($value);
出力例です。
string(15) "こんにちは"
数値なら次のようになります。
$value = 100;
var_dump($value);
int(100)
配列なら次のようになります。
$value = ["apple", "banana"];
var_dump($value);
array(2) {
[0]=>
string(5) "apple"
[1]=>
string(6) "banana"
}
var_dump() は、学習中やデバッグ時にとても役立ちます。
gettypeを使う
型名だけを確認したい場合は、gettype() を使えます。
$value = 100;
echo gettype($value);
出力は次のようになります。
integer
is系関数を使う
特定の型かどうかを判定する関数もあります。
is_int($value);
is_string($value);
is_array($value);
is_bool($value);
is_null($value);
is_object($value);
例です。
$value = "100";
if (is_string($value)) {
echo "文字列です";
}
型によって処理を分けたい場合に便利です。
型宣言
型宣言とは
PHPでは、関数の引数や戻り値に型を指定できます。
function add(int $a, int $b): int
{
return $a + $b;
}
この関数は、int の値を2つ受け取り、int を返すことを表しています。
echo add(1, 2);
出力は次のようになります。
3
型宣言を使うと、関数がどのような値を受け取り、どのような値を返すのかが明確になります。
戻り値の型宣言
関数の戻り値にも型を指定できます。
function getUserName(): string
{
return "田中";
}
この関数は、文字列を返す関数です。
function isPublished(): bool
{
return true;
}
この関数は、真偽値を返します。
戻り値の型宣言を書くことで、関数の役割が読み取りやすくなります。
プロパティの型宣言
クラスのプロパティにも型を指定できます。
class Product
{
public string $name;
public int $price;
public bool $isPublished;
}
このように書くと、各プロパティにどの型の値を入れるべきかが明確になります。
$product = new Product();
$product->name = "Tシャツ";
$product->price = 2980;
$product->isPublished = true;
間違った型を入れようとすると、エラーになることがあります。
$product->price = "高い";
型宣言を使うことで、意図しない値の代入を防ぎやすくなります。
strict_types
strict_typesとは
PHPでは、ファイルの先頭に次のように書くことで、型宣言をより厳密に扱えます。
<?php
declare(strict_types=1);
たとえば、次のような関数があるとします。
function add(int $a, int $b): int
{
return $a + $b;
}
通常のPHPでは、文字列の "1" や "2" が数値として解釈され、動く場合があります。
echo add("1", "2");
しかし、strict_types=1 を指定すると、int を求めている引数に文字列を渡した場合、TypeError になる可能性があります。
<?php
declare(strict_types=1);
function add(int $a, int $b): int
{
return $a + $b;
}
echo add("1", "2");
strict_typesの注意点
strict_types は、PHP全体の型変換をすべて禁止するものではありません。
主に、関数やメソッド呼び出し時のスカラー型宣言に関係する設定です。
また、strict_types はファイル単位で指定します。
基本的には、関数を定義した側ではなく、関数を呼び出す側のファイルの設定が重要です。
そのため、プロジェクトで厳密な型を使いたい場合は、各PHPファイルの先頭に次のように書く運用がよく使われます。
<?php
declare(strict_types=1);
ただし、strict_types=1 を使っても、明示的なキャストはできます。
$value = "123";
$number = (int) $value;
strict_types は、型を安全に扱うための重要な仕組みですが、「PHPの型変換が全部なくなる」と考えないようにしましょう。
mixed型
mixedとは
mixed は、どんな型でも受け取れることを表す型です。
function debugValue(mixed $value): void
{
var_dump($value);
}
この関数には、文字列、数値、配列、真偽値、null など、さまざまな値を渡せます。
debugValue("hello");
debugValue(100);
debugValue(["a", "b"]);
debugValue(null);
mixedの使いすぎに注意する
mixed は便利ですが、使いすぎると関数の意味が曖昧になります。
たとえば、価格を整形する関数なら、次のように書くよりも、
function formatPrice(mixed $price): string
{
return number_format($price) . '円';
}
次のように int を指定した方が安全です。
function formatPrice(int $price): string
{
return number_format($price) . '円';
}
mixed は、どうしても複数の型を受け取る必要がある場合に使うとよいでしょう。
void型
voidとは
void は、関数が値を返さないことを表す型です。
function showMessage(string $message): void
{
echo $message;
}
この関数は、画面に文字を表示するだけで、戻り値は返しません。
voidでreturnは使えるのか
void の関数でも、値を返さない return; は使えます。
function check(bool $ok): void
{
if (!$ok) {
return;
}
echo 'OK';
}
しかし、値を返すことはできません。
function check(): void
{
return 'OK'; // エラー
}
void は、ログ出力、メール送信、画面表示、データ保存など、戻り値が不要な処理で使われます。
never型
neverとは
never は、関数が正常に終了して呼び出し元に戻らないことを表す型です。
たとえば、必ず例外を投げる関数で使えます。
function throwError(): never
{
throw new Exception("エラーが発生しました");
}
また、リダイレクトして処理を終了する関数にも使えます。
function redirect(string $url): never
{
header("Location: {$url}");
exit;
}
この関数は exit で処理を終了するため、呼び出し元には戻りません。
never はPHP 8.1以降で使える型です。
callable型
callableとは
callable は、呼び出し可能な関数やメソッドを表す型です。
function execute(callable $callback): void
{
$callback();
}
この関数には、次のように無名関数を渡せます。
execute(function () {
echo "実行されました";
});
callableが使われる場面
callable は、コールバック関数を扱う場面でよく使われます。
WordPressでも、フック処理でコールバック関数がよく登場します。
add_action('init', function () {
// 初期化処理
});
このように、関数そのものを値として渡す場面で callable が関係します。
iterable型
iterableとは
iterable は、foreach で繰り返し処理できる値を表す型です。
function showItems(iterable $items): void
{
foreach ($items as $item) {
echo $item;
}
}
配列は iterable です。
showItems(["apple", "banana", "orange"]);
また、Iterator や Generator のような繰り返し可能なオブジェクトも iterable として扱えます。
function numbers(): Generator
{
yield 1;
yield 2;
yield 3;
}
showItems(numbers());
配列だけでなく、繰り返し可能なデータを受け取りたい場合に便利です。
enum型
enumとは
enum は、あらかじめ決められた値の集合を表す仕組みです。
PHP 8.1以降で使えます。
たとえば、記事のステータスを表す場合、次のように書けます。
enum PostStatus
{
case Draft;
case Published;
case Archived;
}
これにより、記事ステータスとして使える値を限定できます。
function showStatus(PostStatus $status): void
{
if ($status === PostStatus::Published) {
echo "公開済みです";
}
}
enumを使うメリット
文字列でステータスを管理すると、タイプミスが起こる可能性があります。
$status = "publised"; // published のタイプミス
このようなミスは、コード上ではただの文字列として扱われるため、発見が遅れることがあります。
一方、Enumを使うと、許可された値だけを扱いやすくなります。
$status = PostStatus::Published;
Backed Enum
PHPのEnumには、値を持たない通常のEnumと、値を持つBacked Enumがあります。
enum PostStatus: string
{
case Draft = 'draft';
case Published = 'published';
case Archived = 'archived';
}
Backed Enumでは、各ケースに文字列や整数の値を持たせることができます。
$status = PostStatus::Published;
echo $status->value; // published
データベースに保存する値や、APIのレスポンスと連携する値を扱う場合に便利です。
Union Types
Union Typesとは
Union Typesとは、複数の型のうち、いずれかを受け取ることを表す型指定です。
function findUser(int $id): User|null
{
// ...
}
この例では、戻り値が User または null であることを表しています。
ユーザーが見つかれば User オブジェクトを返し、見つからなければ null を返す、という意味です。
nullable型
User|null のような型は、次のように短く書けます。
function findUser(int $id): ?User
{
// ...
}
?User は、User または null という意味です。
実務では、データが見つからない可能性がある関数でよく使われます。
フォーム値とデータ型
フォームから送られる値は文字列が多い
PHPでフォームから値を受け取る場合、$_GET や $_POST を使います。
$name = $_POST['name'] ?? '';
$age = $_POST['age'] ?? '';
通常の入力欄から送られてくる値は、多くの場合、文字列として扱われます。
たとえば、フォームで年齢に 30 と入力しても、PHPでは "30" という文字列として受け取ることがあります。
$age = $_POST['age'] ?? '';
var_dump($age); // string
数値として使いたい場合は、バリデーションしたうえで変換します。
$ageInput = $_POST['age'] ?? '';
if (filter_var($ageInput, FILTER_VALIDATE_INT) === false) {
echo '年齢は整数で入力してください';
exit;
}
$age = (int) $ageInput;
複数選択では配列になる場合もある
フォームの項目によっては、値が配列になることもあります。
$categories = $_POST['categories'] ?? [];
チェックボックスや複数選択の項目では、配列として受け取る設計になる場合があります。
そのため、フォーム値を扱うときは、「文字列なのか」「配列なのか」「値が存在しないのか」を意識することが大切です。
実務でよくある型の使い分け
用途ごとの型の選び方
実務では、次のように型を使い分けると理解しやすいです。
| 用途 | よく使う型 |
|---|---|
| 名前、メールアドレス、URL、本文 | string |
| ID、件数、ページ番号、価格 | int |
| 税率、割合、平均値 | float |
| 公開状態、ログイン状態、エラー有無 | bool |
| 複数データ、設定、検索条件 | array |
| ユーザー、商品、記事などの構造化データ | object |
| 値がない状態 | null |
記事データの例
たとえば、記事データを配列で表すと次のようになります。
$post = [
"id" => 1,
"title" => "PHPのデータ型とは",
"body" => "本文です",
"is_published" => true,
"category_ids" => [2, 5, 8],
"published_at" => null
];
それぞれの値の型は次のとおりです。
"id" => 1, // int
"title" => "PHPのデータ型とは", // string
"body" => "本文です", // string
"is_published" => true, // bool
"category_ids" => [2, 5, 8], // array
"published_at" => null // null
実際のWebアプリケーションでは、このように複数の型を組み合わせてデータを扱います。
初心者が注意したいデータ型の落とし穴
見た目が同じでも型が違う
$a = 100;
$b = "100";
$a は int、$b は string です。
var_dump($a);
var_dump($b);
出力例です。
int(100)
string(3) "100"
見た目が同じでも、型が違うと比較結果が変わります。
var_dump($a == $b); // true
var_dump($a === $b); // false
0とfalseを混同しない
PHPでは、0 と false を混同するとバグになることがあります。
代表例が strpos() です。
$result = strpos("hello", "h");
"h" は文字列の先頭にあるため、戻り値は 0 です。
しかし、次のように書くと問題が起きます。
if ($result == false) {
echo "見つかりません";
}
0 == false は true と判定されるため、本当は見つかっているのに「見つかりません」と表示される可能性があります。
正しくは、厳密比較を使います。
if ($result === false) {
echo "見つかりません";
}
このように、0 と false を区別することはとても重要です。
空文字とnullを混同しない
$name = "";
$nickname = null;
"" は空の文字列です。
一方、null は値が存在しない状態です。
フォーム入力では、この違いを意識する必要があります。
if ($name === "") {
echo "名前が空です";
}
if ($nickname === null) {
echo "ニックネームは未設定です";
}
「入力されたが空だった」のか、「そもそも値が渡っていない」のかを区別できると、より正確な処理を書けます。
データ型を意識した良いコード例
型を意識しないコード
次の関数は、型を指定していません。
function calculate($price, $tax)
{
return $price + ($price * $tax);
}
この書き方だと、$price や $tax に何を渡せばよいのかが曖昧です。
calculate("abc", "def");
このような不適切な値も渡せてしまいます。
型を意識したコード
型宣言を使うと、関数の意図が明確になります。
function calculateTaxIncludedPrice(int $price, float $taxRate): int
{
return (int) round($price + ($price * $taxRate));
}
この関数では、以下のことがわかります。
| 項目 | 型 |
|---|---|
$price | int |
$taxRate | float |
| 戻り値 | int |
型宣言を書くことで、関数の使い方が明確になり、間違った値を渡したときにも気づきやすくなります。
PHPのデータ型を学ぶ順番
PHP初心者の場合、最初からすべての型を完璧に覚える必要はありません。
まずは、次の順番で理解するとよいでしょう。
まず覚えたい型
string
int
float
bool
array
null
この6つは、PHPの基本的なコードでよく登場します。
次に覚えたい型
object
resource
callable
iterable
mixed
void
never
enum
オブジェクト指向、フレームワーク、型宣言を学ぶ段階で重要になります。
あわせて理解したい考え方
データ型そのものに加えて、以下も重要です。
型変換
型キャスト
== と === の違い
empty() の挙動
strict_types
特に、== と === の違いは早めに理解しておくべきです。
まとめ
PHPのデータ型とは、値の種類を表す仕組みです。
PHPでは、主に次のような型を使います。
| 型 | 例 | 内容 |
|---|---|---|
int | 100 | 整数 |
float | 3.14 | 小数 |
string | "hello" | 文字列 |
bool | true | 真偽値 |
array | [1, 2, 3] | 複数データ |
object | new User() | オブジェクト |
null | null | 値がない |
resource | fopen() の戻り値など | 外部リソースへの参照 |
また、型宣言では次のような型も使われます。
mixed
void
never
callable
iterable
enum
User|null
?User
PHPは動的型付けの言語なので、変数に型を書かなくても使えます。
$value = 100;
$value = "hello";
$value = true;
しかし、自由に書けるぶん、型を意識しないとバグが起きやすくなります。
特に、次のような値の違いには注意が必要です。
100 と "100"
0 と false
"" と null
"0" と empty()
実務では、以下を意識すると安全です。
// 型を確認する
var_dump($value);
// 厳密比較を使う
if ($value === null) {
// ...
}
// 関数には型宣言を使う
function getUserName(int $id): string
{
return "田中";
}
PHPのデータ型は、単なる文法知識ではありません。
型を正しく理解することで、コードの意味が明確になり、バグを減らし、保守しやすいプログラムを書けるようになります。
Web制作、WordPress、Laravelなどを学ぶ場合でも、まずは string、int、bool、array、null、そして === の使い方をしっかり押さえておきましょう。
以上、PHPのデータ型についてでした。
最後までお読みいただき、ありがとうございました。










