PHPで型変換を行う方法や注意点について

採用はこちら

PHPの型変換とは、あるデータ型の値を別のデータ型へ変換することです。

PHPは動的型付け言語であり、変数を宣言するときに必ず型を指定する必要はありません。

また、演算や比較などの状況に応じて、PHPが自動的に型を変換することもあります。

たとえば、HTMLフォームから受け取った "100" という文字列を、計算に使用するため整数の 100 に変換するといった処理が型変換に該当します。

PHPで主に扱われる型には、次のようなものがあります。

  • int:整数
  • float:浮動小数点数
  • string:文字列
  • bool:真偽値
  • array:配列
  • object:オブジェクト
  • null:値が存在しない状態

PHPの型変換は、大きく「明示的な型変換」と「暗黙的な型変換」に分けられます。

目次

キャストを使って明示的に型変換する方法

PHPでは、値の前に変換したい型を記述する「キャスト」を利用して、明示的に型を変換できます。

int型へ変換する

整数へ変換する場合は、(int)を使用します。

$value = "123";

$number = (int) $value;

var_dump($number);

実行結果は次のようになります。

int(123)

(integer)という表記も利用できますが、一般的には短い(int)が使われます。

floatをintへ変換すると、小数部分が取り除かれ、0方向へ丸められます。

var_dump((int) 12.9);   // int(12)
var_dump((int) -12.9);  // int(-12)

したがって、四捨五入を行いたい場合は、単純なキャストではなくround()などを使用します。

また、非常に大きなfloatをintへ変換し、整数型で表現できる範囲を超えた場合は、結果を前提に処理を組まないことが重要です。

文字列をint型へ変換する

数値を表す文字列もintへ変換できます。

$value = "123";

$result = (int) $value;

var_dump($result);

結果は次のとおりです。

int(123)

PHPでは、先頭部分が数値として解釈できる文字列もintへ変換される場合があります。

var_dump((int) "123abc"); // int(123)
var_dump((int) "abc123"); // int(0)

このため、ユーザー入力を単純に(int)でキャストしただけでは、その入力が正しい整数だったことを確認したことにはなりません。

float型へ変換する

浮動小数点数へ変換する場合は、(float)を使用します。

$value = "12.34";

$result = (float) $value;

var_dump($result);

実行結果は次のようになります。

float(12.34)

(double)という書き方も利用できます。

string型へ変換する

文字列へ変換する場合は、(string)を使用します。

$value = 123;

$result = (string) $value;

var_dump($result);

結果は次のとおりです。

string(3) "123"

整数や浮動小数点数を文字列として扱いたい場合などに利用できます。

bool型へ変換する

Booleanへ変換する場合は、(bool)を使用します。

$value = 1;

$result = (bool) $value;

var_dump($result);

結果は次のようになります。

bool(true)

PHPでは、次のような値がBoolean変換時にfalseとして扱われます。

(bool) false;
(bool) 0;
(bool) 0.0;
(bool) "";
(bool) "0";
(bool) [];
(bool) null;

特に注意したいのが文字列の"0"です。

var_dump((bool) "0");

結果は次のようになります。

bool(false)

一方で、次のように文字列として"false"と書かれていても、Booleanのfalseにはなりません。

var_dump((bool) "false");

結果は次のとおりです。

bool(true)

空ではない文字列は、"0"を除いて基本的にtrueとして評価されます。

array型へ変換する

(array)を使用すると、値を配列へ変換できます。

$value = "PHP";

$result = (array) $value;

var_dump($result);

結果は概ね次のようになります。

array(1) {
  [0]=>
  string(3) "PHP"
}

スカラー値を配列へ変換した場合、その値を1つの要素として持つ配列になります。

object型へ変換する

(object)を使用すると、値をオブジェクトへ変換できます。

$data = [
    'name' => 'Taro',
    'age' => 30
];

$obj = (object) $data;

echo $obj->name;

結果は次のようになります。

Taro

連想配列を簡易的なオブジェクトとして扱いたい場合などに利用できます。

ただし、オブジェクトを逆に(array)で配列化する場合は注意が必要です。

$array = (array) $object;

privateやprotectedのプロパティを含むオブジェクトでは、配列化した際のキーが特殊な形式になることがあります。
そのため、配列とオブジェクトを単純に相互変換できると考えるのは避けた方がよいでしょう。

関数を使って型変換する方法

PHPにはキャスト以外にも、特定の型へ変換するための関数が用意されています。

intval()で整数へ変換する

intval()を使用すると、値を整数として取得できます。

$value = "123";

$result = intval($value);

var_dump($result);

結果は次のようになります。

int(123)

基本的には、

(int) $value

と似た用途で使用できます。

intval()では、文字列に対して基数を指定することもできます。

$value = "FF";

$result = intval($value, 16);

echo $result;

結果は次のようになります。

255

16進数や8進数として文字列を解釈したい場合などに利用できます。

floatval()で浮動小数点数へ変換する

floatval()を使用すると、値をfloatとして取得できます。

$value = "12.5";

$result = floatval($value);

var_dump($result);

結果は次のようになります。

float(12.5)

strval()で文字列へ変換する

strval()を使用すると、値を文字列として取得できます。

$value = 123;

$result = strval($value);

var_dump($result);

boolval()でBooleanへ変換する

boolval()を使用すると、値をBooleanとして取得できます。

$value = 1;

$result = boolval($value);

var_dump($result);

結果は次のようになります。

bool(true)

settype()で変数自体の型を変更する

settype()を使用すると、変数そのものの型を変更できます。

$value = "123";

settype($value, "integer");

var_dump($value);

結果は次のようになります。

int(123)

キャストとの大きな違いは、元の変数そのものが変更されることです。

たとえば、

$number = (int) $value;

であれば元の$valueは保持されますが、settype()を使用すると$value自体の型が変わります。

通常は、処理の意図を分かりやすくするために、キャストして別の変数へ代入する方法が使いやすいでしょう。

PHPの暗黙的な型変換とは

PHPでは、プログラマーが明示的にキャストしなくても、処理の文脈に応じて自動的に型が変換されることがあります。

この仕組みは「型ジャグリング(Type Juggling)」と呼ばれます。

数値演算で自動的に変換される場合

たとえば、次のコードを見てみましょう。

$value = "10";

$result = $value + 5;

echo $result;

"10"は文字列ですが、数値として解釈できるため、数値演算の中では数値として扱われます。

結果は次のようになります。

15

PHPの柔軟な型変換は便利ですが、意図しない型変換による不具合を引き起こすこともあります。

数値文字列の扱いに注意する

PHPには「数値文字列」として認識される文字列があります。

たとえば、次のような文字列です。

"123"
"-123"
"12.5"
"1.23e2"

数値として認識できるか確認したい場合は、is_numeric()を利用できます。

$value = "123";

if (is_numeric($value)) {
    echo "数値として扱えます";
}

is_numeric()は整数専用の判定ではない

is_numeric()は、整数だけを判定する関数ではありません。

たとえば、

var_dump(is_numeric("1.5"));
var_dump(is_numeric("1e3"));

のような値も数値として判定されます。

そのため、ユーザーに「整数だけ」を入力してほしい場合は、is_numeric()だけでは要件に合わない可能性があります。

整数として妥当かどうかを確認したい場合は、FILTER_VALIDATE_INTなどを利用する方法があります。

ユーザー入力は型変換だけでなく検証する

Webアプリケーションでは、フォームやURLパラメータから値を受け取るケースが多くあります。

たとえば、

$id = $_GET['id'];

のように取得した値は、基本的に文字列として扱われます。

整数へ変換するだけであれば、次のように書けます。

$id = (int) $_GET['id'];

しかし、これは値を整数へ変換しているだけであり、入力内容が正しい整数であることを確認しているわけではありません。

filter_var()で整数として検証する

整数として有効かを確認したい場合は、次のような方法があります。

$id = filter_var(
    $_GET['id'] ?? null,
    FILTER_VALIDATE_INT
);

if ($id === false) {
    echo '不正な値です';
}

ここで重要なのは、

$id === false

と厳密に比較している点です。

有効な入力として0が渡された場合、結果は整数の0になる可能性があります。

そのため、

if (!$id)

のように判定すると、整数の0と検証失敗時のfalseを区別できません。

型変換とバリデーションは別の処理だと理解しておくことが重要です。

比較演算子による型変換に注意する

PHPの型変換で特に注意したいのが、比較演算子です。

==は緩やかに比較する

==では、異なる型同士を比較するときに型変換が行われる場合があります。

var_dump(10 == "10");

結果は次のようになります。

bool(true)

整数の10と文字列の"10"は型が異なりますが、値として等しいと判断されます。

===は型と値の両方を比較する

===を使用すると、型と値の両方を比較できます。

var_dump(10 === "10");

結果は次のようになります。

bool(false)

左側はint、右側はstringであり、型が異なるためです。

意図しない型変換を避けたい場合は、目的に応じて次の厳密比較を使用するとよいでしょう。

===
!==

ただし、常に厳密比較だけを使えばよいというわけではありません。
比較する値の意味や仕様に応じて使い分けることが大切です。

PHP 8以降では比較ルールの一部が変更されている

PHPのバージョンによって、型変換や比較の挙動が異なる場合があります。

特にPHP 8.0では、数値と数値ではない文字列を緩やかに比較するときのルールが変更されました。

代表的な例が次の比較です。

0 == "foobar"

PHP 7以前ではtrueになるケースでしたが、PHP 8以降ではfalseになります。

古いPHPで作成されたシステムをPHP 8系へ移行する場合は、==!=を使用した比較処理を確認しておくことが重要です。

null・空文字列・0・falseを区別する

PHPでは、次の値はそれぞれ異なる意味を持ちます。

null
""
"0"
0
false

しかし、Boolean変換や緩やかな比較では、同じような結果になる場合があります。

たとえば、

$value = "0";

if (!$value) {
    echo "falseとして評価されます";
}

文字列の"0"はBooleanとしてfalseになるため、条件が成立します。

そのため、

「値が存在しない」

のか、

「0という有効な値が設定されている」

のかを区別する必要がある場合は、厳密比較を使用します。

if ($value === null) {
    // nullの場合
}

入力フォームやデータベース処理では、特に注意が必要なポイントです。

金額計算ではfloatへの型変換に注意する

PHPのfloatは浮動小数点数であり、小数を常に完全な精度で保持できるわけではありません。

そのため、金額計算など正確性が求められる処理では注意が必要です。

たとえば、

$price = (float) "0.1";

のように変換すること自体は可能ですが、多くの小数計算を行うと浮動小数点数特有の誤差が発生する可能性があります。

金額を整数で管理する方法

金額を扱う場合は、最小通貨単位へ変換して整数で管理する方法があります。

たとえば、100.50という値を最小単位で扱う場合は、

$price = 10050;

のように整数として保持します。

高い精度が必要な計算では、用途に応じてBCMathなどの任意精度計算機能を利用する方法もあります。

変数の型を確認する方法

PHPには、変数の型を確認するための関数が用意されています。

代表的なものは次のとおりです。

is_int()
is_float()
is_string()
is_bool()
is_array()
is_object()
is_null()
is_numeric()

たとえば、数値として解釈可能か確認してから処理する場合は次のように記述できます。

$value = "123";

if (is_numeric($value)) {
    $number = (int) $value;
}

デバッグ時にはvar_dump()も便利です。

$value = "123";

var_dump($value);
var_dump((int) $value);

変換前後の値と型を確認できるため、型変換に関する不具合を調査するときにも役立ちます。

strict_typesと型変換の違い

PHPには、次のようにstrict_typesを指定する機能があります。

declare(strict_types=1);

ただし、strict_typesはPHPのあらゆる自動型変換を禁止する機能ではありません。

strict_typesは主に型宣言に関係する

たとえば、次のように関数の引数へ型を指定できます。

declare(strict_types=1);

function add(int $value): int
{
    return $value + 1;
}

strict_types=1は、このようなスカラー型宣言を持つ関数の呼び出し時などの型チェックに関係します。

一方、

$value = (int) "123";

のような明示的なキャストが禁止されるわけではありません。

型変換と型宣言は別の機能

型変換と型宣言は、どちらも「型」に関係する機能ですが、目的が異なります。

型変換

次のコードは、文字列を整数へ変換しています。

$value = (int) "100";

これは型変換です。

型宣言

一方、次のコードでは、関数が受け取る値や返す値の型を指定しています。

function calculate(int $value): int
{
    return $value * 2;
}

これは型宣言です。

PHPで安全性や可読性の高いコードを書くためには、型変換と型宣言の役割を分けて理解することが重要です。

PHPで型変換するときの注意点

PHPの型変換を利用するときは、いくつかのポイントに注意する必要があります。

型変換とバリデーションを混同しない

$id = (int) $value;

と記述しても、入力された値が正しい整数だったことを保証するものではありません。

入力データを検証する必要がある場合は、FILTER_VALIDATE_INTなどを目的に応じて利用します。

比較では型を意識する

==では自動的な型変換が発生することがあります。

型と値を明確に区別したい場合は、

===
!==

を使用します。

“0”のBoolean評価に注意する

文字列の"0"はBooleanとしてfalseになります。

フォーム入力などで0が有効な値の場合は、

if (!$value)

のような単純な判定を避けた方が安全です。

floatからintへの変換は四捨五入ではない

(int) 12.9

の結果は13ではなく12です。

必要に応じて、

round()
floor()
ceil()

などを使い分けます。

PHPのバージョンによる違いを確認する

PHP 8.0では、数値と非数値文字列の緩やかな比較ルールなどが変更されています。

古いPHP向けに作られたコードを移行する場合は、型変換や比較処理の挙動を確認することが重要です。

まとめ

PHPでは、次のようなキャストを利用して明示的に型変換できます。

(int)
(float)
(string)
(bool)
(array)
(object)

また、次のような関数を使用する方法もあります。

intval()
floatval()
strval()
boolval()
settype()

PHPは動的型付け言語であるため、演算や比較などの場面で暗黙的な型変換が行われることもあります。

特に、

"0"
0
false
null
""

といった値は、Boolean評価や緩やかな比較によって意図しない結果につながる可能性があります。

実際のWeb開発では、単純に値をキャストするだけではなく、入力値を検証する、必要な型へ明示的に変換する、比較時には型を意識するという流れを心がけることが重要です。

また、strict_typesや型宣言も適切に組み合わせることで、型に起因するバグを減らし、より保守しやすいPHPコードを作成できます。

以上、PHPで型変換を行う方法や注意点についてでした。

最後までお読みいただき、ありがとうございました。

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