(int) / (string) / (array) キャスト
| 対応: | PHP 4(2000) |
|---|
変数の型を別の型に変換します。PHPは型の自動変換が行われる言語ですが、明示的にキャストすることで意図しない動作を防ぐことができます。
構文
// キャスト演算子で型を変換する (int) $value; (string) $value; (float) $value; (bool) $value; (array) $value; // settype() で変数の型を直接変更する settype($var, $type);
キャスト一覧
| キャスト | 概要 |
|---|---|
| (int) / (integer) | 整数に変換します。小数点以下は切り捨てられます。数値として解釈できない文字列は『0』になります。 |
| (string) | 文字列に変換します。配列は『"Array"』、『true』は『"1"』、『false』と『null』は空文字列になります。 |
| (float) / (double) | 浮動小数点数に変換します。数値として解釈できない文字列は『0.0』になります。 |
| (bool) / (boolean) | 真偽値に変換します。『0』『""』『"0"』『null』『空配列』が『false』、それ以外は『true』になります。 |
| (array) | 配列に変換します。スカラー値は要素1つの配列に、オブジェクトはプロパティを配列化します。 |
| settype($var, $type) | 変数自体の型を変更します。$type には『"int"』『"string"』『"float"』『"bool"』『"array"』を指定します。 |
サンプルコード
sample_cast.php
<?php
// 文字列を整数に変換する
$power_str = "4200";
$power = (int) $power_str;
echo $power; // 4200
var_dump($power); // int(4200)
// 小数を整数にキャストすると小数点以下が切り捨てられる
echo (int) 3.9; // 3(切り上げではない)
// 数値として解釈できない文字列は 0 になる
echo (int) "abc"; // 0
echo (int) "123abc"; // 先頭の数値部分だけ変換されて 123
// 文字列へのキャスト
echo (string) 100; // 100
echo (string) true; // 1
echo (string) false; // 空文字列
echo (string) null; // 空文字列
// 真偽値へのキャスト
var_dump((bool) 1); // bool(true)
var_dump((bool) 0); // bool(false)
var_dump((bool) ""); // bool(false)
var_dump((bool) "0"); // bool(false)("0" は false になる点に注意)
var_dump((bool) "abc"); // bool(true)
// 配列へのキャスト
$input = "sample_name";
print_r((array) $input); // 要素1つの配列になる
// settype() で変数自体の型を変更する
$level = "8";
settype($level, "int");
var_dump($level); // int(8)
// intval() で基数を指定した変換も可能
echo intval("0xFF", 16); // 16進数として解釈されて 255
echo intval("077", 8); // 8進数として解釈されて 63
cast.php
php cast.php
4200
int(4200)
3
0
123
100
1
bool(true)
bool(false)
bool(false)
bool(false)
bool(true)
Array
(
[0] => sample_name
)
int(8)
255
63
概要
PHPの型キャストは、変数を明示的に別の型に変換する仕組みです。フォームから受け取った値は常に文字列型のため、数値として計算に使う場合は『(int)』や『(float)』で明示的にキャストすることが多い。PHPは自動型変換を行うが、暗黙の変換に頼るとバグの原因になる。
キャスト演算子は新しい変換後の値を返すだけで元の変数は変更しません。変数自体の型を変更したい場合は『settype()』を使用してください。
型の判定には『is_array() / is_string() / is_numeric()』が使える。変数の存在確認や空判定には『isset() / empty()』が便利。
(int)キャストは切り捨て(切り上げではない)
(int)3.9は3になる(3.9を切り上げて4にはならない)。切り上げにはceil()、四捨五入にはround()を使う。
<?php // ダメージ計算(小数が出る場合) $base_damage = 380; $multiplier = 1.35; $raw = $base_damage * $multiplier; echo (int) $raw; // 513(小数点以下を切り捨て) echo ceil($raw); // 514(切り上げ) echo round($raw); // 513(四捨五入)
cast_truncate.php
php cast_truncate.php 513 514 513
"abc"を(int)にキャストすると0になる
数値として解釈できない文字列を整数にキャストすると0になる。PHPは警告も出さない。is_numeric()で確認してからキャストするのが安全。
問題のあるパターン(直接キャストすると意図せず0になる):
<?php $input = "abc"; // フォームから受け取った値の例 $level = (int) $input; echo $level; // 0(警告なし)
cast_ng.php
php cast_ng.php 0
is_numeric() で確認してからキャストする:
<?php
$input = "abc"; // フォームから受け取った値の例
if (is_numeric($input)) {
$level = (int) $input;
} else {
$level = 1; // デフォルト値
echo "無効な入力です。デフォルト値を使用: " . $level;
}
cast_ok.php
php cast_ok.php 無効な入力です。デフォルト値を使用: 1
(bool)でfalseになる値
0, "", "0", null, [], 0.0 は全てfalseになる。"0"もfalseになる点は特に注意が必要。
<?php
// falseになる値
var_dump((bool) 0); // bool(false)
var_dump((bool) ""); // bool(false)
var_dump((bool) "0"); // bool(false)(文字列の"0"もfalse)
var_dump((bool) null); // bool(false)
var_dump((bool) []); // bool(false)
var_dump((bool) 0.0); // bool(false)
// trueになる値
var_dump((bool) "false"); // bool(true)(文字列"false"はtrueになる)
var_dump((bool) -1); // bool(true)(負の数もtrue)
// 0がfalseになる問題の例
$rank = 0; // 最上位ランク
if ($rank) {
echo "ランクあり";
} else {
echo "ランクなし(0はfalseになるため)";
}
cast_bool.php
php cast_bool.php bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) bool(true) bool(true) ランクなし(0はfalseになるため)
0を有効な値として扱う場合は === null や isset() で判定するとよい。
実践パターン
フォーム入力値の安全なキャスト
フォームから受け取った値を安全に整数にキャストする例。
<?php
// $_POST から受け取った値はすべて文字列
$post_data = [
'username' => 'user1',
'power' => '9500',
'level' => '8',
'notes' => '',
];
$username = (string) $post_data['username']; // 文字列のまま
$power = is_numeric($post_data['power']) ? (int) $post_data['power'] : 0;
$level = is_numeric($post_data['level']) ? (int) $post_data['level'] : 1;
echo $username . ': パワー ' . $power . ', レベル ' . $level;
cast_form.php
php cast_form.php user1: パワー 9500, レベル 8
キャストを使ったダメージ計算
float計算の結果を整数にキャストしてダメージ値として使う例。
<?php
$characters = [
['name' => 'unit_a', 'base' => 380, 'rate' => 1.35],
['name' => 'unit_b', 'base' => 360, 'rate' => 1.40],
['name' => 'unit_c', 'base' => 340, 'rate' => 1.30],
];
foreach ($characters as $f) {
$damage = (int) ($f['base'] * $f['rate']); // floatを整数に切り捨て
echo $f['name'] . ': ' . $damage . 'ダメージ' . "\n";
}
cast_damage.php
php cast_damage.php unit_a: 513ダメージ unit_b: 504ダメージ unit_c: 442ダメージ
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。