【保存版】PHP初心者向け:var_dump()から文字列・型・フォーム処理まで一気に理解(表でサクッとわかる)

8 min 57 views
PHP

目次

  • var_dump()で「値の中身と型」を一発確認できる
  • 数値型・論理型・NULLの基本を表で把握
  • 文字列のエスケープヒアドキュメント文字アクセスを安全に扱える
  • 型キャストstrval()型判定isset()・empty()・unset()の挙動を正しく理解
  • フォームデータの受け取りGET/POST)を安全に書ける

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-1. 数値型(integer / float)

PHPの数値型には 整数(int)浮動小数点数(float) があります。

注意点
int-3, 0, 42環境依存の上限値あり
(32bit/64bitで差異)
float3.14, 1e-3浮動小数の誤差に注意。
比較は「許容誤差」で

整数の上限値は「実行環境」に依存する

PHPの整数型は「プラットフォーム依存」です。実際にどの範囲まで扱えるかは定数で確認できます。

実行環境PHP_INT_SIZEPHP_INT_MAXPHP_INT_MIN
32bit4 バイト2,147,483,647−2,147,483,648
64bit8 バイト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)

  • 巨大な整数を厳密に扱う必要がある場合は BCMathGMP拡張を利用しましょう。

ゼロ除算(1/0)はどうなる?

整数や浮動小数で ゼロ除算をすると、PHPのバージョンごとに挙動が異なります。

PHP 7系PHP 8+
1 / 0E_WARNING が出て INF を返すDivisionByZeroError 例外
intdiv(1, 0)DivisionByZeroErrorDivisionByZeroError
1 % 0DivisionByZeroErrorDivisionByZeroError
fdiv(1, 0)なしINFNAN を返す(例外なし)

安全なゼロ除算回避例

// 分母が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。
真偽
true
false

暗黙の型変換0, "", [], null などは と評価されます。

 2-3. NULL 型

状態isset()empty()
未定義変数falsetrue
定義済みだが null を代入falsetrue
空文字 ""truetrue
0 / “0” / 0.0truetrue

 3-1. シングルクォートとダブルクォート

記法変数展開エスケープ解釈用途
'...'しない\\\' のみ高速・そのまま書きたい時
"..."する改行 \n など各種を解釈変数・改行などを含めたい時

 3-2. 代表的なエスケープシーケンス(ダブルクォート内)

シーケンス意味
\n改行
\r復帰
\tタブ
\\バックスラッシュ
\"ダブルクォート
\$$ 記号
\e \f \v制御系
\xhh16進(1バイト)
\u{hhhh}Unicodeコードポイント(PHP 7+)

 4-1. ヒアドキュメント(変数展開あり

<?php
$name = "Alice";
$doc = <<<TEXT
Hello, $name
改行や "ダブルクォート" もそのまま書けます。
TEXT;

echo $doc;

 4-2. ナウドキュメント(変数展開なし

<?php
$name = "Alice";
$doc = <<<'TEXT'
Hello, $name  // ← 展開されない
TEXT;

ポイント

  • 終端識別子は 行頭 に置く(前後に空白不可)
  • 末尾にセミコロン ; を忘れない
<?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-1. 明示的な型キャスト

記法
(int)(int)"42"42
(float)(float)"3.14"3.14
(string)(string)123"123"
(bool)(bool)0false

数値っぽい文字列はキャストで数値化できますが、"10px" のような末尾文字は 10 まで解釈される等の挙動に依存せず、filter_var() 等を推奨。

 6-2. strval() との違い

  • strval($x) は「文字列化」専用
  • (string)$x とほぼ同等だが、可読性の面で「意図が明確」な strval() を好むチームもあります
<?php
$id = 123;
echo strval($id);     // "123"
echo (string)$id;     // "123"

 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-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()
  • 変数・配列要素・オブジェクトのプロパティ参照を破棄
<?php
$x = 10;
unset($x);       // $x は未定義状態に
$arr = ['a'=>1,'b'=>2];
unset($arr['a']); // 要素 'a' を削除

注意

unset()戻り値なしif (unset($x)) {} のようには使えません。

 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 どれを使う?

目的推奨理由
検索クエリ等の読み取り$_GETURL共有・ブックマーク可能
フォーム送信(非公開)$_POSTURL露出しない、データ量が多くてもOK
なんでも受けたい避ける$_REQUEST予期しない上書き・衝突の可能性

CSRF 対策(入門メモ)

  • 重要操作は POST + CSRFトークン をチェック
  • フレームワーク利用時は 標準機能を活用 するのが最短・安全
  • var_dump() で「今の型と値」を即確認
  • 数値・論理・NULL表で暗記 → 条件分岐のバグ減
  • 文字列は 記法差'")とエスケープを理解
  • ヒアドキュメント/ナウドキュメントで長文も安全に
  • マルチバイトは mb_*mb_substr など)
  • 型キャストstrval()型判定で「意図の明示」
  • isset()(存在)empty()(実質空) の使い分け
  • フォームは 受け取り→検証→出力エスケープ が基本動線
created by Rinker
¥3,740 (2025/10/10 18:51:14時点 楽天市場調べ-詳細)

 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があります)

関連記事