var_dump、var_export、print_r、デバッグ時に使うのがベストなのはどれ！？

変数の内容を確認する場合、PHPではvar_dump、var_export、print_rなどを使いますが、どれを使うのがベストなのでしょうか。
それぞれの違いを確認しながら、考察していきたいと思います。

## var_dump
> **var_dump — 変数に関する情報をダンプする**
この関数は、指定した式に関してその型や値を含む構造化された情報を 返します。配列の場合、その構造を表示するために各値について再帰的に 探索されます。

[引用元：PHP: var_dump - Manual](https://secure.php.net/manual/ja/function.var-dump.php)
var_dumpは、変数に関する情報をダンプしてくれるもので、配列などの要素数や値のデータ型まで細かく出力してくれます。戻り値はありません。

```php
<?php
$array = array(
    'key1' => 'hoge_1',
    'key2' => 'hoge_2',
    'key3' => 'hoge_3'
);
var_dump($array);
```

```php:出力結果
array(3) {
  ["key1"]=>
  string(6) "hoge_1"
  ["key2"]=>
  string(6) "hoge_2"
  ["key3"]=>
  string(6) "hoge_3"
}
```

## var_export

> **var_export — 変数の文字列表現を出力または返す**
var_export() は、 渡された変数に関する構造化された情報を返します。この関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります。

[引用元：PHP: var_export - Manual](https://secure.php.net/manual/ja/function.var-export.php)
var_exportは、var_dumpに似ているのですが返される表現が有効なPHPコードとなるので、そのまま貼り付けても使える形式となります。そして、var_dumpと異なり第二引数にtrueを指定することで出力させる代わりに戻り値として結果を返させることができます。

```php
<?php
$array = array(
    'key1' => 'hoge_1',
    'key2' => 'hoge_2',
    'key3' => 'hoge_3'
);
var_export($array);
```

```php:出力結果
array (
  'key1' => 'hoge_1',
  'key2' => 'hoge_2',
  'key3' => 'hoge_3',
)
```

## print_r
> **print_r — 指定した変数に関する情報を解りやすく出力する**
print_r() は、 変数の値に関する情報を解り易い形式で表示します。

[引用元：PHP: print_r - Manual](https://secure.php.net/manual/ja/function.print-r.php)
print_rは、変数に関する情報を解りやすく出力するものなので配列のキーと値だけを確認したい場合などに使えます。出力結果がvar_exportに似ているのですが、有効なPHPコードで返ってはこないのでそのまま貼り付けて利用したりすることはできません。var_exportと同様に第二引数にtrueを指定することで出力させる代わりに戻り値として結果を返させることができます。

```php
<?php
$array = array(
    'key1' => 'hoge_1',
    'key2' => 'hoge_2',
    'key3' => 'hoge_3'
);
print_r($array);
```

```php:出力結果
Array
(
    [key1] => hoge_1
    [key2] => hoge_2
    [key3] => hoge_3
)
```

## データ型などを細かく確認したい場合はvar_dump

var_dumpは、var_exportやprin_rと異なり配列の要素数やデータ型などの詳細も出力してくれるので細かい情報を確認したい場合は、var_dumpを使うのがいいと思います。

## 配列のキーと値だけを確認したい場合はvar_exportかprint_r

配列の内容を確認しようとした場合、var_exportとprint_rの結果は似ているのでどちらかを使えばいいと思います。強いて言えば、有効なPHPコードで結果を出したい場合はvar_exportを使い、そうでない場合はprint_rを使うとかでいい気がします。

## 変数に代入したい場合もvar_exportかprint_r

var_exportとprint_rは、第二引数をtrueにすることで戻り値を返させることができるので、変数に代入したい場合は、var_exportかprint_rを使うのがいいと思います。この場合も有効なPHPコードで取得して利用したい場合はvar_exportを使い、そうでない場合はprint_rを使うとかでいいと思います。

```php
<?php
$array = array(
    'key1' => 'hoge_1',
    'key2' => 'hoge_2',
    'key3' => 'hoge_3'
);
//var_exportの結果を変数に代入
$var_export_result = var_export($array,true);
//print_rの結果を変数に代入
$print_r_result = print_r($array,true);
```

## ログファイルに出力する場合は...

ログファイルに出力する場合、簡単に実装できるのはvar_exportとprint_rです。
戻り値を返すことができますので、PHPの標準関数のerror_log関数を利用して

```php:var_export、print_rを使った場合のログファイルへの出力
<?php
$array = array(
    'key1' => 'hoge_1',
    'key2' => 'hoge_2',
    'key3' => 'hoge_3'
);
//var_exportの場合
error_log(var_export($array, true), 3, "./debug.txt");
//print_rの場合
error_log(print_r($array, true), 3, "./debug.txt");
```
上記のような1行で実装することができます。
ただ、データ型などの詳細情報もログファイルに残したい場合もあると思います。
その場合はvar_dumpを使い、ob_startで標準出力のバッファリングを有効にして実現させます。

```php:var_dumpを使った場合のログファイルへの出力
<?php
$array = array(
    'key1' => 'hoge_1',
    'key2' => 'hoge_2',
    'key3' => 'hoge_3'
);
//バッファへの出力開始
ob_start();
//配列をダンプ
var_dump($array);
//バッファの内容を変数に代入
$content = ob_get_contents();
// バッファの終了
ob_end_clean();
error_log($content,3,'./debug.txt');
```

## まとめ
var_dump、var_export、print_rは出力結果や返される形式が、それぞれ少し違います。どれがベストなのかというのは、場合によって変わってくると思います。それぞれの場合に、用途にあったものを使っていけばいいのではないでしょうか。