
【PHP】暗黙のキャスト – 型の自動変換
変数や値の演算では本来、異なる型同士では計算ができません。
しかし、PHPでは暗黙のキャストと呼ばれる自動型変換があるため、型を意識せずに演算することができます。
ここでは暗黙のキャストについて解説します。
なお、キャストについては次の記事をご覧ください。
-
暗黙のキャスト
暗黙のキャストについて
暗黙のキャストは、型の自動変換の仕組みのことです。
プログラムでは通常、異なる型同士の演算を実行できません。
異なる型同士で演算するにはキャストで型を統一する必要があります。
キャストのコードを記述することを明示的なキャストと呼びますが、PHPでは暗黙のキャストがあるため、明示的なキャストを行わずに演算できます。
サンプルコード
暗黙のキャストのサンプルコードをご覧ください。
<?php
// 整数型の値
$num1 = 1000;
// 浮動小数点数型の値
$num2 = 0.5;
$result = $num1 * $num2;
echo '$result -> '.$result."\n";
echo '$result -> '.gettype($result)."\n";
?>
$result -> 500
$result -> double
整数型と浮動小数点型を乗算した結果である$result
の型はdoubleとなっています。
これは演算で異なる型がある場合、暗黙のキャストにより、自動で整数型を浮動小数点型に自動で変換してくれているためです。
型の優先順位
暗黙のキャストは演算対象の変数・値の型を自動変換して統一します。
どの型で統一するかには優先順位があり、数式の演算では浮動小数点数 > 整数型の順になっています。
なお、文字列型は数値に変換した結果が小数点以下を含む場合は浮動小数点数型、含まない場合は整数型となり、いずれかの型に変換されます。
次のコードをご覧ください。
<?php
// 整数型の値
$num1 = 1000;
// 文字列型の値
$num2 = '0.5';
$result = $num1 * $num2;
echo '$result -> '.$result."\n";
echo '$result -> '.gettype($result)."\n";
?>
$result -> 500
$result -> double
8行目で整数型と文字列型の演算を行なっています。
初めに文字列型の$num2
が浮動小数点数型にキャストされます。
そうすると整数型と浮動小数点数型の演算になるため、次は整数型の$num1
が浮動小数点数型にキャストされます。
ここで演算の値が全て浮動小数点数型に統一されたため、演算が実行されます。
実行結果で演算結果を記憶する$result
の型が浮動小数点数型(double)になっていることからも暗黙のキャストが適用されていることが分かります。
なお、$num2
に代入するデータが整数の場合は、実行結果のデータ型はinteger(整数型)となりますので、試してみてください。
演習問題
次の実行結果になるような下記条件を満たすプログラムを作成し、整数型と浮動小数点数型の値を乗算した結果が浮動小数点型になることをプログラムで確認してください。
$value1
に整数型の123
を記憶$value2
に浮動小数点数型の0.25
を記憶$result
に$value1
を$value2
で乗算した結果を記憶$result
の型を出力
$result(value) : 30.75
$result(type) : double
次の実行結果になるような下記条件を満たすプログラムを作成し、整数型と文字列型の値で加算した結果が整数型になることをプログラムで確認してください。
$value1
に整数型の123
を記憶$value2
に文字列型の3
を記憶$result
に$value1
を$value2
で加算した結果を記憶$result
の型を出力
$result(value) : 126
$result(type) : integer
次の実行結果になるような下記条件を満たすプログラムを作成し、整数型と文字列型の値で減算した結果が浮動小数点数型になることをプログラムで確認してください。
$value1
に整数型の123
を記憶$value2
に文字列型の0.2
を記憶$result
に$value1
を$value2
で減算した結果を記憶$result
の型を出力
$result(value) : 122.8
$result(type) : double
まとめ
暗黙のキャストは型を自動変換する仕組みです。
これにより、明示的なキャストを使うことなく自然なコードを書くことができるようになります。
プログラムを期待通りに動かすために、知っておいた方が良い知識なので覚えていきましょう。