PHPの開発をしているとデバッグ時に変数の中身を見て検証する場合があります。
そのときechoで出力できる単純な変数ならばよいですが、配列の場合はechoでは出力できません。
その場合は var_dump や print_r 、 var_export を使えば中身を見れますが、これらの違いってなんでしょう?
var_dumpとprint_rとvar_exportの違いをPHPマニュアルでは
php.netってサイトで調べてみました。
var_dumpは構造を返して、print_rは分かりやすい形で返して、var_exportはvar_dumpと似てるけどPHPコードで返すってことみたいですね。
一言で言えば、出力の仕方がちょっと違うってだけみたいです。
でもなんかよく分からないので実際に次で出力してみようと思います。
var_dumpとは
この関数は、指定した式に関してその型や値を含む構造化された情報を 返します。配列の場合、その構造を表示するために各値について再帰的に 探索されます。
print_rとは
print_r() は、 変数の値に関する情報を解り易い形式で表示します。
print_r()、var_dump() および var_export() は、オブジェクトの protected および private のプロパティも表示します。 静的なクラスメンバーは表示されません。
var_exportとは
var_export() は、 渡された変数に関する構造化された情報を返します。この関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります。
色々な値をvar_dumpとprint_rとvar_exportで出力してみる
var_dumpとprint_rとvar_exportの違いは出力の仕方ということが分かりました。
実際にはどのように変わるのか試してみようと思います。
一番気になるのは”配列”と”オブジェクト”ですね。
あいうえお(文字列)
var_dump
1 |
string(15) "あいうえお" |
print_r
1 |
あいうえお |
var_export
1 |
'あいうえお' |
12345(数値)
var_dump
1 |
int(12345) |
print_r
1 |
12345 |
var_export
1 |
12345 |
true(boolean)
var_dump
1 |
bool(true) |
print_r
1 |
1 |
var_export
1 |
true |
null
var_dump
1 |
NULL |
print_r
何も表示されない
var_export
1 |
NULL |
空文字
var_dump
1 |
string(0) "" |
print_r
何も表示されない
var_export
1 |
'' |
配列
出力する配列は以下の通りです。
1 2 3 4 |
$var = array( "tokyo" => "東京", "osaka" => "大阪", "okinawa" => "沖縄"); |
var_dump
1 2 3 4 5 6 7 8 |
array(3) { ["tokyo"]=> string(6) "東京" ["osaka"]=> string(6) "大阪" ["okinawa"]=> string(6) "沖縄" } |
print_r
1 2 3 4 5 6 |
Array ( [tokyo] => 東京 [osaka] => 大阪 [okinawa] => 沖縄 ) |
var_export
1 2 3 4 5 |
array ( 'tokyo' => '東京', 'osaka' => '大阪', 'okinawa' => '沖縄', ) |
オブジェクト
出力するクラスは以下のように定義しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php class Sample1 { public $data1 = 1; protected $data2 = 2; private $data3 = 3; public function fnc1($v) { $this->data += $v; } protected function fnc2($v) { $this->data += $v; } private function fnc3($v) { $this->data += $v; } } |
アクセス修飾子をいくつか用意しましたがどうなりますか!
var_dump
1 2 3 4 5 6 7 8 |
object(Sample1)#1 (3) { ["data1"]=> int(1) ["data2":protected]=> int(2) ["data3":"Sample1":private]=> int(3) } |
print_r
1 2 3 4 5 6 |
Sample1 Object ( [data1] => 1 [data2:protected] => 2 [data3:Sample1:private] => 3 ) |
var_export
1 2 3 4 5 |
Sample1::__set_state(array( 'data1' => 1, 'data2' => 2, 'data3' => 3, )) |
文字列の戻り値で受け取る
var_dumpとprint_rとvar_exportの関数はどれも変数の中身を出力する関数です。
この「出力する」というのはechoと同じように画面上にHTMLの一部として出力します。
しかし、print_rとvar_exportに関しては第二引数に true を設定すると出力せずに文字列の戻り値として受け取ることが出来ます。
これにより、DBに保存したりログファイルに書き出すことができます。
例えば $ary という配列の変数があったとします。
print_rだと
1 |
$str = print_r($ary, true); |
のように書くと出力する内容を $str に格納することができます。
同様に var_export の場合は、
1 |
$str = var_export($ary, true); |
のように文字列として受け取ることができます。
まとめ
var_dumpとprint_rとvar_exportの違いは出力の仕方。
var_dumpとvar_export はデータ構造を出力し、print_rは分かりやすく値だけ出力するといった感じです。
var_exportとprint_rは第二引数にtrueを設定することで出力せずに文字列として受け取ることもできます。
出力して気になった部分は、print_r でNULLか空文字を出力した場合何も表示されないということ。
当然といえば当然なんですが、もしNULLや空文字が想定される場合には検証が出来ないことも考えられます。
コメントを残す