はじめに
PHPでコードを書いていて、「この変数、今どんな値が入っているんだろう?」と確認したくなる場面は数え切れないほどあります。単純に echo で出力しようとしても、配列やオブジェクトはそのままでは表示できませんし、値が null なのか空文字列 "" なのか、0 なのか false なのかといった違いも echo だけでは判別できません。
そこで欠かせないのが var_dump() 関数です。この関数は、変数の型情報を含めて、その中身を人間が読める形式で詳細に出力してくれます。配列やオブジェクトのネストした構造も再帰的に展開して表示するため、デバッグ作業において最も基本的かつ強力なツールの一つです。本記事では基本的な使い方から、実践的な活用パターン、そしてprint_r()などの類似関数との使い分けまで詳しく解説します。
関数概要
| 項目 | 内容 |
|---|---|
| 関数名 | var_dump() |
| 所属拡張 | コア関数(標準で常に利用可能) |
| シグネチャ | var_dump(mixed $value, mixed ...$values): void |
| 引数 | $value, ...$values — ダンプ対象の変数(複数指定可能) |
| 戻り値 | なし(void)。標準出力に直接表示する |
| 対応バージョン | PHP 4以降 |
| 類似関数 | print_r()(型情報なし)、var_export()(PHPコードとして出力) |
| 出力先 | 標準出力(ブラウザやCLIにそのまま表示される) |
出力の流れ(イメージ図)
変数
$data = ['name' => '太郎', 'age' => 30, 'active' => true];
│
▼
var_dump($data)
│
┌──────────┴──────────────────────┐
│ 型情報を含めて再帰的に構造を展開する │
└──────────┬──────────────────────┘
▼
array(3) {
["name"]=>
string(6) "太郎"
["age"]=>
int(30)
["active"]=>
bool(true)
}
ポイントは、var_dump() が単に値を表示するだけでなく、データ型(string, int, bool, array, objectなど)と、文字列の場合はバイト数まで表示するという点です。この情報があることで、「期待していた型と実際の型が違っていた」というよくあるバグの原因を素早く特定できます。
実践サンプル7選
例1:基本的な使い方
<?php
class BasicDumper
{
public function inspect(mixed $value): void
{
// 型情報と値を詳細に出力する
var_dump($value);
}
}
$dumper = new BasicDumper();
$dumper->inspect('hello'); // string(5) "hello"
$dumper->inspect(42); // int(42)
$dumper->inspect(3.14); // float(3.14)
$dumper->inspect(true); // bool(true)
$dumper->inspect(null); // NULL
例2:複数の変数を一度にダンプするデバッグヘルパー
<?php
class MultiValueDebugger
{
/**
* var_dump()は可変長引数を受け取れるため、
* 複数の値を一度の呼び出しでまとめて確認できる
*/
public function dumpAll(mixed ...$values): void
{
var_dump(...$values);
}
}
$debugger = new MultiValueDebugger();
$debugger->dumpAll('第1引数', 100, ['a', 'b'], null);
例3:出力をキャプチャして文字列として保存するロガー
<?php
class DumpLogger
{
/**
* ob_start()とob_get_clean()を組み合わせることで、
* var_dump()の出力を直接表示せず文字列として取得する
*/
public function captureDump(mixed $value): string
{
ob_start();
var_dump($value);
return ob_get_clean();
}
public function logToFile(mixed $value, string $filePath): void
{
$dumpString = $this->captureDump($value);
file_put_contents($filePath, date('Y-m-d H:i:s') . "\n" . $dumpString . "\n", FILE_APPEND);
}
}
$logger = new DumpLogger();
$logger->logToFile(['status' => 'error', 'code' => 500], '/tmp/debug.log');
例4:null・空文字列・falseの違いを明確に区別する
<?php
class ValueTypeDistinguisher
{
/**
* echo だけでは区別が難しい "似て非なる値" の違いを
* var_dump()で明確に可視化する
*/
public function demonstrate(): void
{
$values = [
'null値' => null,
'空文字列' => '',
'数値のゼロ' => 0,
'文字列のゼロ' => '0',
'真偽値false' => false,
'空配列' => [],
];
foreach ($values as $label => $value) {
echo "{$label}: ";
var_dump($value);
}
}
}
$distinguisher = new ValueTypeDistinguisher();
$distinguisher->demonstrate();
例5:オブジェクトの内部状態を確認するデバッグクラス
<?php
class User
{
public function __construct(
public string $name,
private int $age,
protected array $roles = []
) {
}
}
class ObjectInspector
{
/**
* var_dump()はpublic/private/protectedすべてのプロパティを
* アクセス修飾子付きで表示できる
*/
public function inspectObject(object $obj): void
{
var_dump($obj);
}
}
$inspector = new ObjectInspector();
$user = new User('太郎', 30, ['admin', 'editor']);
$inspector->inspectObject($user);
// object(User)#1 (3) {
// ["name"]=> string(6) "太郎"
// ["age":"User":private]=> int(30)
// ["roles":protected]=> array(2) { ... }
// }
例6:APIレスポンスのデバッグ用ラッパー(開発環境限定)
<?php
class ApiDebugDumper
{
public function __construct(private bool $isDevelopment)
{
}
/**
* 開発環境の場合のみvar_dump()による詳細出力を行い、
* 本番環境では意図せずデバッグ情報が漏れないようにする
*/
public function dumpIfDev(mixed $response, string $label = ''): void
{
if (!$this->isDevelopment) {
return;
}
echo "=== {$label} ===" . PHP_EOL;
var_dump($response);
}
}
$debugDumper = new ApiDebugDumper(isDevelopment: true);
$debugDumper->dumpIfDev(['status' => 200, 'data' => ['id' => 1]], 'APIレスポンス');
例7:xdebugと連携した見やすい出力の確認(環境依存)
<?php
class XdebugAwareDumper
{
/**
* xdebug拡張が有効な環境では、var_dump()の出力が
* 自動的に色付け・整形されて見やすくなる
*/
public function inspect(mixed $value): void
{
if (extension_loaded('xdebug')) {
echo '[xdebugによる整形表示が有効です]' . PHP_EOL;
}
var_dump($value);
}
}
$dumper = new XdebugAwareDumper();
$dumper->inspect([
'nested' => [
'level2' => ['level3' => 'deep value'],
],
]);
関連関数との比較
| 関数 | 役割 | var_dumpとの違い |
|---|---|---|
var_dump() | 型情報付きで変数の中身を詳細出力 | 本記事の対象。最も詳細な情報を出力する |
print_r() | 変数の中身を人間が読みやすい形式で出力 | 型情報(string/intなど)を表示しない、より簡潔な出力 |
var_export() | 変数をPHPコードとして評価可能な形式で出力 | 出力結果をそのままPHPコードに貼り付けて使える形式になる |
debug_zval_refcount() | 変数の参照カウントを取得(デバッグ用、非推奨気味) | 内部的な参照カウントという、より低レベルな情報を扱う |
Symfony VarDumper (dump()) | Symfonyが提供する高機能な変数ダンプ | 折りたたみ表示や色分けなど、より高度なUIでの出力が可能(外部ライブラリ) |
よくある落とし穴(注意点)
- 本番環境に出力を残してしまう デバッグのために追加した
var_dump()の呼び出しを消し忘れたまま本番環境にデプロイすると、機密情報を含む内部データが画面に表示されてしまう危険があります。デプロイ前のコードレビューやLintツールでの検出を徹底しましょう。 - HTTPヘッダー送信前の出力によるエラー
var_dump()は即座に出力を行うため、後続でheader()関数を使ってHTTPヘッダーを送信しようとすると「headers already sent」エラーが発生することがあります。デバッグ時は特に注意が必要です。 - 循環参照を持つオブジェクトのダンプで無限ループにならないか心配する 実際にはPHPの
var_dump()は循環参照を検知して*RECURSION*と表示し、無限ループを防ぐようになっています。ただし出力が非常に長くなることはあるため、大きなオブジェクトグラフには注意が必要です。 - 出力結果をそのままコードに転記できると誤解する
var_dump()の出力形式(string(6) "太郎"など)はあくまで人間が読むための表示形式であり、PHPコードとしてそのまま貼り付けて使うことはできません。コードとして再利用したい場合はvar_export()を使いましょう。 - 大量データに対するパフォーマンスへの影響 巨大な配列やオブジェクトを
var_dump()すると、出力生成自体に時間がかかり、レスポンスが遅延することがあります。デバッグ時は必要な範囲だけを抽出してからダンプするなどの工夫が有効です。
まとめ
| 観点 | まとめ |
|---|---|
| 何をする関数か | 変数の型情報を含めて、値の詳細な中身を再帰的に出力する |
| 主な用途 | デバッグ時の変数確認、型の違いによるバグの特定、オブジェクトの内部状態確認 |
| 出力の特徴 | 型名・文字列の長さ・アクセス修飾子などの詳細情報を含む |
| 類似関数との違い | print_r()より詳細、var_export()とは異なりPHPコードとしては再利用不可 |
| 注意点 | 本番環境への出力残存、ヘッダー送信前の呼び出し、機密情報の漏洩リスク |
var_dump() はPHP開発において最も基本的でありながら、最も頻繁に使われるデバッグツールの一つです。単なる値の確認だけでなく、型の違いを正確に把握することでバグの早期発見につながります。ただし、本番環境への出力残存には十分注意し、必要に応じてログファイルへの出力キャプチャなどの工夫を取り入れていきましょう。
