目次
この記事のゴール
var_dump()
で「値の中身と型」を一発確認できる- 数値型・論理型・NULLの基本を表で把握
- 文字列のエスケープやヒアドキュメント、文字アクセスを安全に扱える
- 型キャスト/strval()/型判定/isset()・empty()・unset()の挙動を正しく理解
- フォームデータの受け取り(GET/POST)を安全に書ける
1. デバッグの基本:var_dump()で「型と値」を丸裸にする
var_dump()
は 値の型・長さ・中身 を詳細に表示する最強のデバッグ関数です。
配列やオブジェクトも階層的に見えるので、「思った通りの型か?」を即チェックできます。
<?php
$age = 20;
$name = "Alice";
$isMember = true;
$user = ['name' => $name, 'age' => $age, 'member' => $isMember];
var_dump($age); // int(20)
var_dump($name); // string(5) "Alice"
var_dump($isMember);// bool(true)
var_dump($user); // array(3) { ["name"]=> string(5) "Alice" ... }
似た関数との違い(使い分け)
関数 | 出力の詳細さ | 目的 |
---|---|---|
var_dump() | 高い | 型+値 を正確に確認 |
print_r() | 中 | 人間に読みやすい形でざっくり |
var_export() | 中〜高 | PHPコードとして再利用可能な表現 |
2. 基本のデータ型(スカラー):数値・論理・NULL
2-1. 数値型(integer / float)
PHPの数値型には 整数(int) と 浮動小数点数(float) があります。
型 | 例 | 注意点 |
---|---|---|
int | -3 , 0 , 42 | 環境依存の上限値あり (32bit/64bitで差異) |
float | 3.14 , 1e-3 | 浮動小数の誤差に注意。 比較は「許容誤差」で |
整数の上限値は「実行環境」に依存する
PHPの整数型は「プラットフォーム依存」です。実際にどの範囲まで扱えるかは定数で確認できます。
実行環境 | PHP_INT_SIZE | PHP_INT_MAX | PHP_INT_MIN |
---|---|---|---|
32bit | 4 バイト | 2,147,483,647 | −2,147,483,648 |
64bit | 8 バイト | 9,223,372,036,854,775,807 | −9,223,372,036,854,775,808 |
echo PHP_INT_SIZE; // 4 or 8
echo PHP_INT_MAX; // 最大値
echo PHP_INT_MIN; // 最小値
上限を超えるとどうなる?
- オーバーフロー時は自動的に float に変換されます(警告なし)。
var_dump(PHP_INT_MAX + 1); // float(9.2233720368548E+18)
- 巨大な整数を厳密に扱う必要がある場合は BCMath や GMP拡張を利用しましょう。
ゼロ除算(1/0)はどうなる?
整数や浮動小数で ゼロ除算をすると、PHPのバージョンごとに挙動が異なります。
式 | PHP 7系 | PHP 8+ |
---|---|---|
1 / 0 | E_WARNING が出て INF を返す | DivisionByZeroError 例外 |
intdiv(1, 0) | DivisionByZeroError | DivisionByZeroError |
1 % 0 | DivisionByZeroError | DivisionByZeroError |
fdiv(1, 0) | なし | INF や NAN を返す(例外なし) |
安全なゼロ除算回避例
// 分母が0なら先にチェック
function safeDivide(float $a, float $b): float {
if ($b == 0.0) {
return INF; // または 0, null, 例外…要件に応じて
}
return $a / $b;
}
// PHP 8以降は fdiv() も便利
$result = fdiv(1, 0); // INF を返す
ポイント
旧環境(PHP 7)では「警告+INF」になるケースがあるので、コードの移植性を考えるなら必ず事前チェックを入れておくのが安全です。
浮動小数点数の誤差に注意しよう
PHPに限らず、ほとんどのプログラミング言語で「小数」は 2進数(バイナリ)で近似的に表現 されています。
このため、見た目では正確でも内部では誤差が含まれている ことがよくあります。
<?php
var_dump(0.1 + 0.2); // float(0.30000000000000004)
var_dump((0.1 + 0.2) === 0.3); // bool(false)
なぜこうなるの?
- 0.1(10進数)は 2進数で「無限小数」になり、コンピュータは有限桁でしか扱えません。
- そのため「完全な 0.1」ではなく「0.100000000000000005551…」のような近似値がメモリに保存されます。
- 計算結果として 「ごく小さなズレ」 が発生するわけです。
誤差への対処方法
方法 | コード例 | 解説 |
---|---|---|
許容誤差を設ける | php if (abs(($a + $b) - 0.3) < 0.00001) { echo "ほぼ等しい"; } | 「差がごく小さいなら等しい」とみなす(最も一般的な方法) |
小数を整数で扱う | php $yen = 100; $tax = 8; $price = $yen * (100 + $tax) / 100; | 金額やポイント計算なら「円単位・ポイント単位」を整数で管理する |
BCMath拡張を使う | php echo bcadd("0.1", "0.2", 2); // "0.30" | 任意精度で小数演算できる(金融系などに必須) |
まとめ:浮動小数を扱うコツ
===
(厳密比較)は使わない → 代わりに「許容誤差比較」を。- 金額やスコア計算のように正確さが必要な場面では 整数または BCMath。
- 「ざっくり計算」で十分なら float でOK。
2-2. 論理型(boolean)
値 | 真偽 |
---|---|
true | 真 |
false | 偽 |
暗黙の型変換で 0
, ""
, []
, null
などは 偽 と評価されます。
2-3. NULL 型
状態 | isset() | empty() |
---|---|---|
未定義変数 | false | true |
定義済みだが null を代入 | false | true |
空文字 "" | true | true |
0 / “0” / 0.0 | true | true |
3. 文字列の基礎:リテラルとエスケープ
3-1. シングルクォートとダブルクォート
記法 | 変数展開 | エスケープ解釈 | 用途 |
---|---|---|---|
'...' | しない | \\ と \' のみ | 高速・そのまま書きたい時 |
"..." | する | 改行 \n など各種を解釈 | 変数・改行などを含めたい時 |
3-2. 代表的なエスケープシーケンス(ダブルクォート内)
シーケンス | 意味 |
---|---|
\n | 改行 |
\r | 復帰 |
\t | タブ |
\\ | バックスラッシュ |
\" | ダブルクォート |
\$ | $ 記号 |
\e \f \v | 制御系 |
\xhh | 16進(1バイト) |
\u{hhhh} | Unicodeコードポイント(PHP 7+) |
4. ヒアドキュメント/ナウドキュメント
4-1. ヒアドキュメント(変数展開あり)
<?php
$name = "Alice";
$doc = <<<TEXT
Hello, $name
改行や "ダブルクォート" もそのまま書けます。
TEXT;
echo $doc;
4-2. ナウドキュメント(変数展開なし)
<?php
$name = "Alice";
$doc = <<<'TEXT'
Hello, $name // ← 展開されない
TEXT;
ポイント
- 終端識別子は 行頭 に置く(前後に空白不可)
- 末尾にセミコロン
;
を忘れない
5. 文字へのアクセス(インデックス)
<?php
$s = "PHP";
echo $s[0]; // "P"(1バイト)
- 返るのは1バイト単位。マルチバイト(日本語)は mb_substr を使う:
<?php
$jp = "あいう";
echo mb_substr($jp, 0, 1); // "あ"
注意:
$str{0}
の 波括弧アクセスは PHP 8.0 で削除。必ず $str[0]
を使う。
6. 型キャストと strval()
6-1. 明示的な型キャスト
記法 | 例 |
---|---|
(int) | (int)"42" → 42 |
(float) | (float)"3.14" → 3.14 |
(string) | (string)123 → "123" |
(bool) | (bool)0 → false |
数値っぽい文字列はキャストで数値化できますが、"10px"
のような末尾文字は 10 まで解釈される等の挙動に依存せず、filter_var()
等を推奨。
6-2. strval() との違い
strval($x)
は「文字列化」専用(string)$x
とほぼ同等だが、可読性の面で「意図が明確」なstrval()
を好むチームもあります
<?php
$id = 123;
echo strval($id); // "123"
echo (string)$id; // "123"
7. 変数の型を判定する
7-1. 代表的な型判定関数
関数 | 例 | 用途 |
---|---|---|
gettype($v) | "integer" , "NULL" | 人が読むための型名 |
is_int($v) | true/false | 厳密に int か 判定 |
is_float($v) | 同上 | 浮動小数か |
is_bool($v) | 同上 | 真偽値か |
is_null($v) | 同上 | NULLか |
is_string($v) | 同上 | 文字列か |
is_array($v) | 同上 | 配列か |
is_object($v) | 同上 | オブジェクトか |
is_numeric($v) | 数値 or 数値文字列 | "42" も true になる |
8. 変数の「状態」を調べる:isset() と empty()
8-1. isset():「定義されていて、かつ NULL でない」なら true
<?php
var_dump(isset($a)); // 未定義 → false
$a = null;
var_dump(isset($a)); // null → false
$a = "";
var_dump(isset($a)); // 空文字 → true
8-2. empty():「空か?」(ゆるめの判定)
以下は すべて true:
""
(空文字),"0"
,0
,0.0
,[]
,false
,null
, 未定義変数
<?php
if (empty($_POST['email'])) {
// 入力なし・"0"・未定義などをひとまとめに「空」と判定
}
使い分けの目安
- 「存在してる?」→
isset()
- 「実質空じゃない?」→
empty()
9. 値の解除:unset()
- 変数・配列要素・オブジェクトのプロパティ参照を破棄
<?php
$x = 10;
unset($x); // $x は未定義状態に
$arr = ['a'=>1,'b'=>2];
unset($arr['a']); // 要素 'a' を削除
注意:
unset()
は 戻り値なし。if (unset($x)) {}
のようには使えません。
10. フォームデータの受け取り(安全第一)
10-1. まずは基本の受け取り
<?php
// 推奨:filter_input を使う(存在しないときは null)
$name = filter_input(INPUT_POST, 'name');
$email = filter_input(INPUT_POST, 'email');
10-2. XSS対策(出力時にエスケープ)
<?php
function h($s) { return htmlspecialchars($s ?? '', ENT_QUOTES, 'UTF-8'); }
echo "<p>お名前:", h($name), "</p>";
10-3. サニタイズ/バリデーション例
<?php
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 0, 'max_range' => 120]
]);
if ($email === false) { /* メール形式エラー */ }
if ($age === false) { /* 年齢の範囲エラー */ }
10-4. $_GET
/ $_POST
/ $_REQUEST
どれを使う?
目的 | 推奨 | 理由 |
---|---|---|
検索クエリ等の読み取り | $_GET | URL共有・ブックマーク可能 |
フォーム送信(非公開) | $_POST | URL露出しない、データ量が多くてもOK |
なんでも受けたい | 避ける$_REQUEST | 予期しない上書き・衝突の可能性 |
CSRF 対策(入門メモ)
- 重要操作は POST + CSRFトークン をチェック
- フレームワーク利用時は 標準機能を活用 するのが最短・安全
11. まとめ:最初に覚えるべき「型&状態&入出力」チェックの型
var_dump()
で「今の型と値」を即確認- 数値・論理・NULL は 表で暗記 → 条件分岐のバグ減
- 文字列は 記法差(
'
と"
)とエスケープを理解 - ヒアドキュメント/ナウドキュメントで長文も安全に
- マルチバイトは
mb_*
(mb_substr
など) - 型キャスト/
strval()
/型判定で「意図の明示」 isset()
(存在) とempty()
(実質空) の使い分け- フォームは 受け取り→検証→出力エスケープ が基本動線
付録:コピペで使えるチート集
A. 浮動小数比較テンプレ
<?php
function nearlyEquals(float $a, float $b, float $eps = 1e-8): bool {
return abs($a - $b) < $eps;
}
B. 出力エスケープ関数
<?php
function h($s) { return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); }
C. 必須チェック(POST)
<?php
$errors = [];
$name = filter_input(INPUT_POST, 'name');
if (empty($name)) $errors['name'] = 'お名前は必須です。';
D. 型判定・ログ
<?php
function debug($label, $value) {
echo "== $label ==\n";
var_dump($value);
}
よくある落とし穴(初心者あるある)
- 比較に
==
を使って意図せず型変換 → なるべく===
を使う empty("0")
がtrue
(ゼロ文字列は空とみなされる)- 日本語の1文字切り出しに
$s[0]
→mb_substr
を使う - 出力時に
htmlspecialchars
を忘れる → XSSの原因
Webアプリケーション向きPHPのオンラインスクールならこちら
Web作成者向けのPHPスクールならこちらのWordpress副業コース
買い切りの動画講座Unazuki(WordpressでPHPがあります)
