【PHP】print_r、var_dump、var_export の違いと使い方 | 出力関数・デバッグ方法

export-dump-printr

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、PHPでの開発・デバッグに役立つ出力系統の関数について解説していきます。

取り上げるのは、print_r, var_dump, var_export の3つのメソッドです。

この3つの違いと使い方について解説していきます。

ぜひこれらを使い分けて開発・デバッグを進めていきましょう!

また以前に、PHPの標準出力機能である echo と printの違いと使い方について解説しました。

気になる方は、こちらもぜひCheckしてみてください。

【echo と printの違いと使い方について解説】

print_rとは?

PHP-Manualでそれぞれの関数に関する情報を確認していきます。

まずは、print_r() から確認していきます。

print_r — 指定した変数に関する情報を解りやすく出力する

print_r(mixed $value, bool $return = false): string|bool

print_r() は、 変数の値に関する情報を解り易い形式で表示します。

print_r()var_dump() および var_export() は、オブジェクトの protected および private のプロパティも表示します。 static が付いたクラスメンバーは表示されません。

[ パラメータ ]

value : 表示したい式。

return : print_r() の結果を取得したい場合には return 引数を使います。

この引数が true の場合には、 print_r() は情報を表示するかわりに情報を返します。

[ 戻り値 ]

string、int, float を指定した場合はその値が出力されます。 

array を指定した場合、キーと要素を表す形式で値が 表示されます。

object に関しても同様の表示形式となります。

return パラメータが true の場合は、 この関数は string を返します。

それ以外の場合の戻り値は true です。

引用元: print_r – Manual – PHP


ポイントは、第二引数に「 true 」(returnパラメータ)を設定すると、出力の代わりに戻り値が返される点です。

<?php

$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];

$array2 = [
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

// 1. 第二引数に「 true 」(returnパラメータ)を設定
$print_return = print_r($array, true);

echo 'print_r() の return文字列を出力します'. "\n";

echo $print_return . "\n";

// 2. 第二引数は設定せずに標準出力する
print_r($array2);
echo "\n";


// [ 実行結果 ]

// print_r() の return文字列を出力します
// Array
// (
//     [0] => robotama
//     [1] => ロボ玉
//     [2] => ロボ玉試作1号機
// )

// Array
// (
//     [type] => robotama
//      => ロボ玉試作1号機
//     [power] => 1000
//     [robotama_flag] => 1
// )

var_exportとは?

次に、var_export() の情報を確認していきます。

第二引数に「 true 」(returnパラメータ)を設定すると、出力の代わりに戻り値が返される点は、print_r()と共通です。

ただprint_r() と違う点は、返される値が有効なPHPコードである点です。

また、var_export()の有効なPHPコードであると言う特性により、出力される結果が実際のPHPデータの形のままでわかりやすい点も特徴です。

個人的には、より簡単にデータ構造を確認したい時は、var_export() を使って、さらに細かい情報を知りたい時は、後述する var_dump() を使用するようにしています。

var_export — 変数の文字列表現を出力または返す

var_export(mixed $value, bool $return = false): ?string

var_export() は、 渡された変数に関する構造化された情報を返します。

この関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります

[ パラメータ ]

value : エクスポートしたい変数

return : 使用されかつ true に設定された場合、var_export() は変数表現を出力する代わりに返します。

[ 戻り値 ]

return パラメータが使用され true と評価される場合、 変数表現を返します。

そうでない場合、この関数は null を返します。

引用元: var_export – Manual – PHP
<?php

$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];

$array2 = [
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

// 1. 第二引数に「 true 」(returnパラメータ)を設定
$export_value = var_export($array, true);

echo 'var_export() の return文字列を出力します'. "\n";
echo $export_value . "\n";

// 2. 第二引数は設定せずに標準出力する
var_export($array2);
echo "\n";


// [ 実行結果 ]

// var_export() の return文字列を出力します
// array (
//   0 => 'robotama',
//   1 => 'ロボ玉',
//   2 => 'ロボ玉試作1号機',
// )

// array (
//     'type' => 'robotama',
//     'value' => 'ロボ玉試作1号機',
//     'power' => 1000,
//     'robotama_flag' => true,
//   )

var_dumpとは?

最後に var_dump() の情報を確認していきます。

var_dump — 変数に関する情報をダンプする

var_dump(mixed $valuemixed ...$values): void

この関数は、指定した式に関してその型や値を含む構造化された情報を 返します。

配列の場合、その構造を表示するために各値について再帰的に 探索されます。

オブジェクトのすべての public、private および protected なプロパティが出力されます。

ただし、そのオブジェクトが __debugInfo() メソッド を実装している場合は、その限りではありません。

[ パラメータ ]

value : ダンプしたい変数。

values : ダンプしたい追加の変数。

[ 戻り値 ]

値を返しません。

引用元: var_dump – Manual – PHP

print_r() や var_export() と違って var_dump() は戻り値を返しません。

var_dump() はデータの情報を詳しく確認するのに適した関数です。

次のSampleCodeを見ても分かるとおり、print_r() や var_export() とは違って、

データの型の情報や配列のlengthなども記載されており、出力される情報量が多いです。

<?php

$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];

$array2 = [
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

var_dump($array);

var_dump($array2);

// [ 実行結果 ]

// array(3) {
//     [0]=>
//     string(8) "robotama"
//     [1]=>
//     string(9) "ロボ玉"
//     [2]=>
//     string(22) "ロボ玉試作1号機"
//   }

// array(4) {
//     ["type"]=>
//     string(8) "robotama"
//     ["value"]=>
//     string(22) "ロボ玉試作1号機"
//     ["power"]=>
//     int(1000)
//     ["robotama_flag"]=>
//     bool(true)
//   }

print_r と var_dump と var_export の出力結果の違いを比較する

3つの出力関数の出力結果の違いを並べてみると、次のとおりです。

<?php

$array2 = [
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

print_r($array2);

// 1. print_r 出力結果
// Array
// (
//     [type] => robotama
//      => ロボ玉試作1号機
//     [power] => 1000
//     [robotama_flag] => 1
// )


var_export($array2);

// 2. var_export 出力結果
// array (
//     'type' => 'robotama',
//     'value' => 'ロボ玉試作1号機',
//     'power' => 1000,
//     'robotama_flag' => true,
// )

// 2-1. 出力可能な形で

var_dump($array2);

// 3. var_dump 出力結果
// array(4) {
//     ["type"]=>
//     string(8) "robotama"
//     ["value"]=>
//     string(22) "ロボ玉試作1号機"
//     ["power"]=>
//     int(1000)
//     ["robotama_flag"]=>
//     bool(true)
// }

// [ Point ]
// 3-1. 配列の要素数やデータ型などの詳細も出力される!

print_r と var_dump と var_export の使い分けポイント

次にこの3つのメソッドの使い分けのポイントを見ていきましょう。

  1. データ型や配列の要素数などを細かく確認したい場合は var_dump
  2. シンプルに配列のkey&valueだけを確認したい場合は、var_export か print_r
  3. 変数に代入したい場合は var_export か print_r

個人的には、基本的なデータの確認は、var_export() を使用して、データの詳細を知りたい場合は、var_dump() を使用する方針でいます。

ログファイルに出力する場合は、var_export() か print_r()

もちろん、標準出力の代わりに変数に値を返却できるvar_export() と print_r() は、それを外部ファイルに出力するような実装をすることができます。

PHPの標準関数のerror_log関数を利用して次のように実装することができます。

<?php
$array2 = [
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

//var_exportの場合
error_log(var_export($array2, true), 3, "./debug.txt");

//print_rの場合
error_log(print_r($array2, true), 3, "./debug.txt");

print_r の配列, 連想配列, Objectの出力結果

3つのメソッドの違いがわかったところで、ここからは各メソッドの出力結果を細かくみていきます。

print_r での配列, 連想配列, Objectでの出力結果を見てみましょう。

<?php

// [ print_r-基本構文 ] print_r(mixed $value, bool $return = false): string|bool

// Sample-Data-1: 配列
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];

// Sample-Data-2: 連想配列
$array2 = [
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

// Sample-Data-3: CastしたObject (stdClass)
$object = (object)[
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

class Robotama {
    public $name = 'ロボ玉';
    public $robotama_flag = true;
    public function hello() {
        echo 'ロボ玉なのだ!';
    }
}

// Sample-Data-4: 自前で用意したClassから作成したObject
$robotamaInstance = new Robotama;

// それぞれ出力してみます。
print_r($array);

print_r($array2);

print_r($object);

print_r($robotamaInstance);
コマンドライン・実行結果
Array
(
    [0] => robotama
    [1] => ロボ玉
    [2] => ロボ玉試作1号機
)

Array
(
    [type] => robotama
     => ロボ玉試作1号機
    [power] => 1000
    [robotama_flag] => 1
)

stdClass Object
(
    [type] => robotama
     => ロボ玉試作1号機
    [power] => 1000
    [robotama_flag] => 1
)

Robotama Object
(
    [name] => ロボ玉
    [robotama_flag] => 1
)

var_dump の配列, 連想配列, Objectの出力結果

var_dump での配列, 連想配列, Objectでの出力結果を見てみましょう。

// [ var_dump-基本構文 ] var_dump(mixed $value, mixed ...$values): void

// Sample-Data-1: 配列
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];

// Sample-Data-2: 連想配列
$array2 = [
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

// Sample-Data-3: CastしたObject (stdClass)
$object = (object)[
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

class Robotama {
    public $name = 'ロボ玉';
    public $robotama_flag = true;
    public function hello() {
        echo 'ロボ玉なのだ!';
    }
}

// Sample-Data-4: 自前で用意したClassから作成したObject
$robotamaInstance = new Robotama;

// それぞれ出力してみます。
var_dump($array);

var_dump($array2);

var_dump($object);

var_dump($robotamaInstance);
コマンドライン・実行結果
array(3) {
  [0]=>
  string(8) "robotama"
  [1]=>
  string(9) "ロボ玉"
  [2]=>
  string(22) "ロボ玉試作1号機"
}

array(4) {
  ["type"]=>
  string(8) "robotama"
  ["value"]=>
  string(22) "ロボ玉試作1号機"
  ["power"]=>
  int(1000)
  ["robotama_flag"]=>
  bool(true)
}

object(stdClass)#1 (4) {
  ["type"]=>
  string(8) "robotama"
  ["value"]=>
  string(22) "ロボ玉試作1号機"
  ["power"]=>
  int(1000)
  ["robotama_flag"]=>
  bool(true)
}

object(Robotama)#2 (2) {
  ["name"]=>
  string(9) "ロボ玉"
  ["robotama_flag"]=>
  bool(true)
}

var_export の配列, 連想配列, Objectの出力結果

var_export での配列, 連想配列, Objectでの出力結果を見てみましょう。

// [ var_export-基本構文 ] var_export(mixed $value, bool $return = false): ?string

// Sample-Data-1: 配列
$array = ['robotama', 'ロボ玉', 'ロボ玉試作1号機'];

// Sample-Data-2: 連想配列
$array2 = [
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

// Sample-Data-3: CastしたObject (stdClass)
$object = (object)[
    'type' => 'robotama',
    'value' => 'ロボ玉試作1号機',
    'power' => 1000,
    'robotama_flag' => true,
];

class Robotama {
    public $name = 'ロボ玉';
    public $robotama_flag = true;
    public function hello() {
        echo 'ロボ玉なのだ!';
    }
}

// Sample-Data-4: 自前で用意したClassから作成したObject
$robotamaInstance = new Robotama;

// それぞれ出力してみます。
var_export($array);

var_export($array2);

var_export($object);

var_export($robotamaInstance);
コマンドライン・実行結果
array (
  0 => 'robotama',
  1 => 'ロボ玉',
  2 => 'ロボ玉試作1号機',
)

array (
  'type' => 'robotama',
  'value' => 'ロボ玉試作1号機',
  'power' => 1000,
  'robotama_flag' => true,
)

(object) array(
   'type' => 'robotama',
   'value' => 'ロボ玉試作1号機',
   'power' => 1000,
   'robotama_flag' => true,
)

Robotama::__set_state(array(
   'name' => 'ロボ玉',
   'robotama_flag' => true,
))

【おまけ】PHPでconsole.log()を使用する(JavaScript活用事例)

ここからは、おまけ編です。

JavaScript使いには馴染みの深いconsole.log()をPHPで使用したいときに次のようなCodeが使えます!

ポイントは、引数に渡されるデータを出力するために「json_encode()」でJSON形式に変換しているところです。

<?php

// < おまけ: PHPでconsole.log()を使用する(JavaScript活用事例) >

// 1. 自前で console_log関数を作る!
function console_log($data){

 // 2. 中身は、script-Tag & PHP から JavaScriptにデータを受け渡すためのJSON文字列
  echo '<script>';
  echo 'console.log(' . json_encode($data) . ')';
  echo '</script>';
}
 
$array = array('ロボ玉', 'ももちゃん', '白桃');
console_log($array);

Twitterやってます!Follow Me!

神聖グンマー帝国の逆襲🔥

神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!

PHP / Laravel書籍

参考・引用

  1. 型宣言 – Manual – PHP
  2. print_r – Manual – PHP
  3. var_dump – Manual – PHP
  4. var_export – Manual – PHP
  5. [PHP] print_r、var_dump、var_export のちがい
  6. var_dump、var_export、print_r、デバッグ時に使うのがベストなのはどれ!?
  7. 【PHP入門】配列の中身を表示する|var_dump・print_r・var_export
  8. 【PHP】console.logを使ってデバッグログを出力する方法

最近の投稿