PHPのキャストの使い方について

採用はこちら

PHPのキャストとは、値のデータ型を別の型へ明示的に変換する仕組みです。

PHPでは、整数のint、小数のfloat、文字列のstring、真偽値のbool、配列のarray、オブジェクトのobjectなど、さまざまなデータ型を扱います。

PHPには状況に応じて自動的に型を変換する仕組みもありますが、プログラム上で型を明確にしたい場合にはキャストを使用します。

たとえば、文字列の"100"を整数の100へ変換する場合は、次のように記述します。

$value = "100";
$number = (int)$value;

var_dump($number);

実行結果は次のとおりです。

int(100)

変数の前に(int)を付けることで、文字列を整数へ明示的に変換できます。

目次

PHPで使用できる主なキャスト

PHPでは、主に次のようなキャストを使用できます。

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

それぞれ変換できる型や、変換後の挙動が異なります。

int型へキャストする

値を整数へ変換するときは、(int)を使用します。

$value = "123";

$result = (int)$value;

var_dump($result);

実行結果は次のとおりです。

int(123)

数値として解釈できる文字列であれば、整数へ変換できます。

float型の値をint型へ変換することも可能です。

$value = 12.8;

$result = (int)$value;

var_dump($result);

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

int(12)

floatからintへキャストすると、小数部分が取り除かれ、0方向へ丸められます。

そのため、負の数の場合も注意が必要です。

var_dump((int)12.9);
var_dump((int)-12.9);

結果は次のとおりです。

int(12)
int(-12)

これはfloor()による切り捨てとは異なります。

たとえば、

var_dump(floor(-12.9));

では、結果は-13になります。

float型へキャストする

値を小数として扱いたい場合は、(float)を使用します。

$value = "123.45";

$result = (float)$value;

var_dump($result);

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

float(123.45)

整数をfloat型へ変換することもできます。

$value = 100;

$result = (float)$value;

var_dump($result);

PHPではdoubleもfloat型として扱われます。

string型へキャストする

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

$value = 123;

$result = (string)$value;

var_dump($result);

実行結果は次のとおりです。

string(3) "123"

真偽値も文字列へ変換できます。

var_dump((string)true);
var_dump((string)false);

trueは文字列の"1"へ変換されます。

一方、falseは空文字列""になります。

そのため、真偽値をそのまま画面表示やログ出力に使用すると、意図した表示にならない場合があります。

bool型へキャストする

値を真偽値へ変換したい場合は、(bool)を使用します。

$value = 1;

$result = (bool)$value;

var_dump($result);

結果は次のとおりです。

bool(true)

PHPでは、代表的に次のような値がfalseとして扱われます。

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

一方、次のような値はtrueになります。

(bool) 1;
(bool) -1;
(bool) "PHP";
(bool) [1, 2, 3];

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

var_dump((bool)"0");
var_dump((bool)"false");

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

bool(false)
bool(true)

文字列の"false"は、PHPでは特別なfalse値として扱われません。

設定ファイルやフォームなどから"true""false"という文字列を受け取る場合には、単純に(bool)へキャストしないほうがよいケースがあります。

array型へキャストする

値を配列へ変換する場合は、(array)を使用します。

$value = "PHP";

$result = (array)$value;

var_dump($result);

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

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

通常のスカラー値を配列へキャストすると、その値をインデックス0に持つ配列になります。

概念的には、次のような配列です。

[
    0 => "PHP"
]

整数の場合も同様です。

$value = 100;

$result = (array)$value;

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

[
    0 => 100
]

nullを配列へキャストすると、空の配列になります。

$result = (array)null;

var_dump($result);

結果は次のとおりです。

array(0) {
}

object型へキャストする

値をオブジェクトへ変換する場合は、(object)を使用します。

たとえば、配列をオブジェクトへ変換できます。

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

$user = (object)$data;

echo $user->name;

実行結果は次のとおりです。

Taro

配列をオブジェクトへキャストすると、配列のキーがオブジェクトのプロパティとして扱われます。

スカラー値をオブジェクトへキャストした場合は、stdClassオブジェクトとなり、その値はscalarプロパティに格納されます。

$obj = (object)"PHP";

var_dump($obj);

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

object(stdClass)#1 (1) {
  ["scalar"]=>
  string(3) "PHP"
}

単純なデータを一時的にオブジェクトとして扱う場合には便利ですが、本格的なアプリケーションでは、クラスを定義してオブジェクトを生成するほうが適している場合もあります。

PHPでキャストする基本的な書き方

PHPのキャストは、変換したい値や変数の直前に型を指定します。

基本的な書式は次のとおりです。

$result = (型)$value;

文字列を整数へ変換する場合は、次のように記述します。

$price = "1500";

$price = (int)$price;

計算するときに直接キャストすることも可能です。

$price = "1500";

$total = (int)$price * 2;

echo $total;

実行結果は次のとおりです。

3000

キャストしても元の変数は変わらない

キャストした値を別の変数へ代入した場合、元の変数の型が自動的に変更されるわけではありません。

$value = "100";

$number = (int)$value;

var_dump($value);
var_dump($number);

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

string(3) "100"
int(100)

元の$valueは文字列のままです。

元の変数自体を整数へ変更したい場合は、キャストした値を再代入します。

$value = "100";

$value = (int)$value;

PHPのキャストと自動型変換の違い

PHPには、プログラムの処理内容に応じて自動的に型を変換する仕組みがあります。

たとえば、数値として解釈できる文字列を計算に使用するケースです。

$value = "100";

$result = $value + 50;

echo $result;

結果は次のとおりです。

150

この場合、PHPが"100"を数値として解釈して計算します。

一方、明示的に整数として扱いたい場合にはキャストできます。

$value = "100";

$result = (int)$value + 50;

明示的にキャストすることで、コードを読む側にも「この値は整数として扱う」という意図が伝わりやすくなります。

キャストと型変換関数の違い

PHPにはキャスト以外にも、データ型を変換するための関数があります。

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

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

たとえば、intval()を使用すると整数値を取得できます。

$value = "123";

$result = intval($value);

var_dump($result);

基本的な用途は、

$result = (int)$value;

と似ています。

intval()では基数を指定できる

intval()には、キャストにはない機能もあります。

代表的なのが基数の指定です。

$value = "1010";

$result = intval($value, 2);

echo $result;

結果は次のとおりです。

10

第2引数に2を指定しているため、文字列"1010"を2進数として解釈しています。

ほかにも、次のような変換が可能です。

intval("10", 8);   // 8
intval("FF", 16);  // 255

単純に型を変換したいだけであればキャストを使用し、基数などの追加機能が必要な場合にはintval()を利用するとよいでしょう。

ユーザー入力をキャストするときの注意点

フォームなどから受け取ったデータを数値として扱うために、キャストを使用することがあります。

たとえば、POSTデータの年齢を整数へ変換する場合です。

$age = (int)($_POST['age'] ?? 0);

しかし、キャストには重要な注意点があります。

キャストはバリデーションではない

キャストはデータ型を変換する処理であり、入力値が正しいかどうかを検証する処理ではありません。

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

$value = "abc";

$result = (int)$value;

var_dump($result);

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

int(0)

つまり、

$age = (int)$_POST['age'];

と書いたからといって、ユーザーが正しい整数を入力したことを確認したわけではありません。

外部から受け取った値については、キャストとは別にバリデーションを行う必要があります。

filter_var()で整数を検証する

整数として正しい入力か確認したい場合には、filter_var()を利用できます。

$age = filter_var(
    $_POST['age'] ?? null,
    FILTER_VALIDATE_INT
);

if ($age === false) {
    echo '正しい整数を入力してください。';
}

このように、

「値を変換する処理」

「値が条件を満たしているか確認する処理」

は分けて考えることが重要です。

数値文字列をキャストするときの注意点

文字列を数値へキャストする場合には、その文字列がどのような形式なのかを確認することも重要です。

$value = "500";

$result = (int)$value;

var_dump($result);

この場合は問題なく500へ変換できます。

一方、外部から受け取った値が本当に数値として扱えるのか確認したい場合には、is_numeric()を利用できます。

$value = "500";

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

ただし、is_numeric()がtrueになる値と、アプリケーションで許可したい入力値が必ずしも一致するとは限りません。

年齢・価格・個数など、用途に応じて適切なバリデーション条件を設けることが大切です。

nullをキャストした場合の挙動

nullも別の型へキャストできます。

たとえば次のコードです。

var_dump((int)null);
var_dump((float)null);
var_dump((string)null);
var_dump((bool)null);
var_dump((array)null);

代表的には次のような値へ変換されます。

int(0)
float(0)
string(0) ""
bool(false)
array(0) {
}

nullをキャストすると情報が失われる場合がある

nullを別の型へキャストすると、元々値が存在しなかったという情報が失われる場合があります。

たとえば、

$value = null;

$result = (int)$value;

とすると、$result0になります。

そのため、

「実際に0という値が設定されていた」

のか、

「値が存在せずnullだった」

のかを区別できなくなる可能性があります。

データベースのNULL値やAPIレスポンスなどを扱う場合には、安易にキャストしないほうがよいケースもあります。

floatからintへキャストするときの注意点

floatからintへのキャストは手軽ですが、いくつか注意点があります。

四捨五入にはならない

次のコードを見てみましょう。

$value = 19.9;

$result = (int)$value;

var_dump($result);

結果は19です。

(int)によるキャストは四捨五入ではありません。

四捨五入したい場合はround()を使用します。

$result = round(19.9);

切り上げならceil()、切り下げならfloor()を利用できます。

ceil(19.1);
floor(19.9);

目的に応じて使い分けましょう。

非常に大きなfloatの変換には注意する

intで表現できる範囲を超えたfloatをintへキャストする場合、期待どおりの値になることを前提にしたコードは避けたほうが安全です。

大量の数値データや非常に大きなIDなどを扱う場合には、値の範囲にも注意しましょう。

floatには精度の問題がある

floatには、浮動小数点数特有の精度問題があります。

そのため、計算結果をそのままintへキャストすると、期待と異なる結果になる場合があります。

たとえば、金額計算など高い精度が必要な処理では、floatを安易に使用するのではなく、整数の最小単位で管理するなど、用途に応じた設計を検討することが重要です。

キャストした型を確認する方法

キャスト後の値やデータ型を確認する場合には、var_dump()が便利です。

$value = "123";

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

実行結果は次のとおりです。

string(3) "123"
int(123)

echoでは値は表示できますが、データ型までは分かりにくいため、開発中の確認にはvar_dump()が適しています。

gettype()で型名を取得する

型だけを確認したい場合には、gettype()も使用できます。

$value = 123;

echo gettype($value);

値の内容まで確認したい場合はvar_dump()、型名だけ確認したい場合はgettype()というように使い分けることができます。

PHPでキャストを使用する代表的な場面

PHPのキャストは、Webアプリケーションのさまざまな場面で使用されます。

フォーム入力を数値として扱う

フォームから送信された値を個数として扱うケースがあります。

$quantity = (int)($_POST['quantity'] ?? 0);

$total = $quantity * 1000;

ただし、実際のアプリケーションでは、キャストするだけでなく入力値のバリデーションも行うことが重要です。

データベースから取得した値の型を整える

利用しているデータベースドライバーや取得設定などによっては、数値に見える値が文字列として取得されることがあります。

その場合、アプリケーション側で型を明確にするためにキャストすることがあります。

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

ただし、データベースから取得される型は環境やドライバーによって異なるため、常に文字列になるとは限りません。

APIレスポンスの型を整える

JSONとしてAPIレスポンスを返す場合には、値の型を明確にすることが重要です。

$data = [
    'id' => (int)$user['id'],
    'price' => (float)$product['price'],
    'active' => (bool)$user['active']
];

echo json_encode($data);

整数・小数・真偽値などを適切な型へ変換しておくことで、JSONでも意図した型として出力しやすくなります。

PHPのキャストと型宣言の違い

PHPにはキャストとは別に、引数や戻り値などの型を指定する「型宣言」があります。

たとえば、次のように記述できます。

function calculate(int $price, int $quantity): int
{
    return $price * $quantity;
}

ここで指定しているintはキャストではありません。

キャストは、

(int)$value;

のように、値自体を別の型へ変換する仕組みです。

一方、型宣言は、

function test(int $value): int
{
    return $value;
}

のように、関数の引数や戻り値などに期待する型を指定する仕組みです。

strict_typesとの違い

PHPでは、スカラー型の扱いをより厳格にしたい場合に、次のように記述できます。

declare(strict_types=1);

ただし、strict_typesはキャストとは別の仕組みです。

strict_types=1を指定した場合でも、

$value = (int)"100";

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

「型を変換するキャスト」と「型をチェックする型宣言」は、それぞれ役割が異なります。

PHPのキャストを使うときのポイント

PHPでは自動型変換が行われるため、すべての値をキャストする必要はありません。

一方で、フォーム・データベース・APIなど外部から受け取った値を、アプリケーション内部で特定の型として扱いたい場合には、明示的なキャストが役立ちます。

PHPでよく使用するキャストは次のとおりです。

(int)$value;
(float)$value;
(string)$value;
(bool)$value;
(array)$value;
(object)$value;

キャストを使用するときに特に重要なのは、キャストとバリデーションを混同しないことです。

キャストはあくまでもデータ型を変換する処理であり、その値が正しいかどうかを保証するものではありません。

外部から受け取る値については、filter_var()is_numeric()などを利用して適切に検証したうえで、必要に応じてキャストを行うとよいでしょう。

また、floatからintへの変換では0方向へ丸められることや、boolへ変換すると文字列の"0"falseになる一方で"false"trueになることなど、PHP特有の変換ルールにも注意が必要です。

それぞれのデータ型がどのように変換されるのかを理解したうえでキャストを使用することで、意図しない型変換による不具合を防ぎ、読みやすく安全なPHPコードを書きやすくなります。

以上、PHPのキャストの使い方についてでした。

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

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