| この記事の要点 |
|
キャストの一覧
var_dump((int)"42"); // int(42)
var_dump((float)"1.5"); // float(1.5)
var_dump((string)42); // string(2) "42"
var_dump((bool)"0"); // bool(false) ← "0" は偽
var_dump((array)"a"); // ["a"]
var_dump((object)['n'=>1]); // stdClass {n: 1}
// 別名
(integer)$x; // (int) と同じ
(boolean)$x; // (bool) と同じ
(double)$x; // (float) と同じ
文字列から数値への変換ルール
var_dump((int)"42"); // 42
var_dump((int)"42abc"); // 42 ← 先頭の数値だけ拾う。エラーにならない
var_dump((int)"abc"); // 0 ← 数値が無ければ 0
var_dump((int)""); // 0
var_dump((int)" 42"); // 42 先頭の空白は無視される
var_dump((int)"0x1A"); // 0 16 進表記は解釈されない
var_dump((int)"1e3"); // 1000 指数表記は解釈される
var_dump((int)"3.9"); // 3 切り捨て(四捨五入ではない)
var_dump((int)-3.9); // -3 0 方向に切り捨て
var_dump((int)null); // 0
var_dump((int)true); // 1
変換に失敗しても例外は出ません。「入力が数値かどうか」を判定したいなら、キャストではなく検証関数を使います。
入力値の検証
$input = $_GET['page'] ?? '';
// 1. 数値として妥当かを判定してから使う
$page = filter_var($input, FILTER_VALIDATE_INT);
if ($page === false) {
$page = 1; // 数値でなければ既定値
}
// 範囲も一緒に検証できる
$page = filter_var($input, FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1, 'max_range' => 100, 'default' => 1],
]);
// 2. is_numeric で数値文字列かを見る
var_dump(is_numeric("42")); // true
var_dump(is_numeric("42abc")); // false
var_dump(is_numeric("1e3")); // true
var_dump(is_numeric(" 42")); // true 先頭空白は許される
var_dump(is_numeric("42 ")); // PHP 8.0 以降は true(8.0 で変更)
// 3. 整数かどうか
var_dump(ctype_digit("42")); // true 0-9 だけか(負数は false)
filter_var() は「妥当でなければ false」を返すので、(int) と違って不正入力を検出できます。0 が返る場合と false が返る場合を区別するため、判定は必ず === false で行ってください。
関数による変換
var_dump(intval("42")); // 42
var_dump(intval("1A", 16)); // 26 基数を指定できる(キャストにはできない)
var_dump(intval("0x1A", 0)); // 26 0 なら接頭辞から自動判別
var_dump(floatval("1.5kg")); // 1.5
var_dump(strval(1.0)); // "1"
var_dump(boolval("0")); // false
$x = "42";
settype($x, "integer"); // 変数そのものを書き換える
var_dump($x); // int(42)
var_dump(number_format(1234567)); // "1,234,567" ← 表示用。数値ではなく文字列
bool への変換
| 値 | (bool) の結果 |
|---|---|
false 0 0.0 -0.0 "" "0" [] null | false |
それ以外すべて("0.0" "false" " " [0] -1 を含む) | true |
var_dump((bool)"0"); // false ← 文字列の "0" だけ特別扱い
var_dump((bool)"0.0"); // true
var_dump((bool)"false"); // true
var_dump((bool)[]); // false
var_dump((bool)[0]); // true 要素があるので真
"0" が偽になるのは PHP 特有です。フォームから来た文字列の "0" を「入力あり」と判定したいときは === '' や strlen() で見ます。
配列・オブジェクトへの変換
var_dump((array)"abc"); // ["abc"] 要素 1 個の配列
var_dump((array)null); // [] 空配列
var_dump((array)5); // [5]
class User {
public string $name = '田中';
protected int $age = 30;
private bool $admin = false;
}
print_r((array)new User());
// ['name' => '田中', "\0*\0age" => 30, "\0User\0admin" => false]
オブジェクトを配列にキャストすると、protected / private のキーに制御文字が混ざります。実用には get_object_vars() か json_decode(json_encode($obj), true) を使ってください(オブジェクトを配列に変換する方法)。
暗黙の型変換と strict_types
function half(int $n): int {
return (int)($n / 2);
}
half("10"); // 5 既定では "10" が int に変換される
half("abc"); // TypeError(PHP 8 以降)
half(3.9); // Deprecated: 暗黙の float→int 変換で精度が落ちる
<?php
declare(strict_types=1); // ファイルの先頭行に置く(他の文より前)
function half(int $n): int { return (int)($n / 2); }
half(10); // 5
half("10"); // TypeError: half(): Argument #1 ($n) must be of type int, string given
declare(strict_types=1) はそのファイルで書かれた呼び出しにだけ効きます。ライブラリ側に付けても、呼ぶ側のファイルに無ければ変換されます。新規のファイルには付けておくと、型の取り違えを早い段階で発見できます。
数値の精度
var_dump(0.1 + 0.2 == 0.3); // false 浮動小数点の誤差
var_dump(abs(0.1 + 0.2 - 0.3) < 1e-9); // true
var_dump((int)"9223372036854775808"); // int(9223372036854775807) 桁あふれで丸められる
var_dump(PHP_INT_MAX); // 9223372036854775807
// 金額は文字列 + bcmath で扱う
echo bcadd('0.1', '0.2', 1); // 0.3
金額や数量など誤差が許されない計算では float を使わず、整数(最小単位で保持)か bcmath を使います。
日付との相互変換
// 文字列 → DateTime
$d = new DateTimeImmutable('2026-09-07 12:00:00');
$d = DateTimeImmutable::createFromFormat('Y/m/d', '2026/09/07');
if ($d === false) {
// 形式が合わないと false。必ず確認する
}
// DateTime → 文字列
echo $d->format('Y-m-d H:i:s');
// 文字列 → UNIX 時刻(失敗すると false)
$ts = strtotime('2026-09-07');
var_dump($ts === false);
// UNIX 時刻 → 文字列
echo date('Y-m-d', $ts);
// タイムゾーンを明示する
$d = new DateTimeImmutable('now', new DateTimeZone('Asia/Tokyo'));
strtotime() は解釈できない文字列で false を返します。(int)strtotime($s) と書くと失敗が 0(=1970年)になって気づけません。必ず === false で判定してください。
JSON との変換
$data = ['name' => '田中', 'age' => 30];
echo json_encode($data); // {"name":"田中","age":30}
echo json_encode($data, JSON_UNESCAPED_UNICODE); // {"name":"田中","age":30}
$back = json_decode('{"a":1}'); // stdClass として受け取る
$back = json_decode('{"a":1}', true); // 連想配列として受け取る
// 失敗の検出(PHP 7.3 以降)
try {
json_decode('{bad}', true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo $e->getMessage(); // Syntax error
}
// 数値がとても大きいと精度が落ちる
var_dump(json_decode('{"id":12345678901234567890}')->id); // float
var_dump(json_decode('{"id":12345678901234567890}', false, 512,
JSON_BIGINT_AS_STRING)->id); // string
json_decode() は失敗しても既定では null を返すだけです。JSON_THROW_ON_ERROR を付けると例外になり、握りつぶしを防げます。
フォームの値はすべて文字列
// チェックボックスは「送られてこない」か "on"
$isPublic = isset($_POST['is_public']); // bool として受ける
// 数値
$qty = filter_input(INPUT_POST, 'qty', FILTER_VALIDATE_INT) ?: 1;
// 金額(小数を扱うなら文字列のまま検証してから整数化する)
$raw = $_POST['price'] ?? '';
if (!preg_match('/\A\d+(\.\d{1,2})?\z/', $raw)) {
throw new InvalidArgumentException('金額の形式が不正です');
}
$priceInSen = (int)round((float)$raw * 100); // 最小単位の整数で保持する
// 空文字と 0 と未入力を区別する
$note = $_POST['note'] ?? null;
if ($note === null) { /* 項目自体が無い */ }
elseif ($note === '') { /* 入力欄が空 */ }
$_GET / $_POST の値は常に文字列(または配列)です。1 と "1" の違いで === の比較が食い違うため、受け取った直後に検証して型を決めてしまうのが安全です。
関連
- 文法 — 親カテゴリ
- データ型
- 比較演算子 — 比較時の型変換
- 代入の際の注意点
- オブジェクトを配列に変換する方法
- A non well formed numeric value encountered
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38