終電23時15分って早くね?

都内のIT企業で働くカラオケ大好きエンジニアの雑記

print_r()とvar_dump()どちらをつかう??

みなさんはデバッグの際、print_r()とvar_dump()のどちらを使いますか??

どちらの関数も、オブジェクトの構造を再帰的にたどって出力することができるのは共通していますが、その出力内容は異なります。

print_r()とvar_dump()のそれぞれのマニュアルを見てみる。

それぞれの関数のマニュアルを見てみましょう。

■print_r
http://www.php.net/manual/ja/function.print-r.php

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

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

■var_dump
http://www.php.net/manual/ja/function.var-dump.php

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

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

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

ということで、
説明を読んだだけじゃよくわかりませんが、
やはりどちらも変数に関する情報を表示することができるようです。

じゃあどちらでデバッグしてもOK・・・?

じゃあプログラムをデバッグする際、
どちらを使ってもよいのかー
というのはちょっと間違いで、
print_r()とvar_dump()で出力の形式や内容がちょっとずつですが違います。

特に特徴的なのは、配列やオブジェクトの構造を持っていない変数に関する出力が違うというところとvar_dump()は型まで表示されるということでしょうか。

print_r()とvar_dump()の出力の違い

実際に違いを見てみると・・・

print_r()での出力 var_dump()での出力
null NULL
true 1 bool(true)
false bool(false)
123 123 int(123)
'ok' ok string(2) "ok"
array(1,2) Array(
[0] => 1
[1] => 2
)
array(2) {
[0] => int(1)
[1] => int(2)
}
class X {
public $p = 1;
private $q = 2;
}
new X()
X Object
(
[p] => 1
[q:X:private] => 2
)
object(X)#1 (2){
["p"] => int(1)
["q":"X":private] => int(2)
}

※『徹底攻略 PHP5 技術者認定 [上級] 試験問題集』(インプレスジャパン、2013/9/19) P39より

というような感じになります。

私個人的な使用方法としては、
変数の型まで確認する必要がある場合はvar_dump()、
変数の中身を確認したい場合はprint_r()というような使い分けをしています。

まぁ使用頻度的にはprint_r()のほうが多いかなぁ・・・という感じですが。


とまぁ、print_r()とvar_dump()は出力内容が違うのだなぁということを念頭において、
デバックしたい状況で臨機応変に使い分けていきましょう!