PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
2024/06/27
PHPのデバッグで使う print_r、var_dump、var_exportの動作の違い
PHPでプログラム開発を行う時のデバッグなどで変数の中身を確認する際に「print_r()」「var_dump()」「var_export()」「echo()」を使うかと思います。
人によって使う関数が異なり、たぶん、初めて使った関数を何気なくずっと使い続けているのではないかと思いますし、複数の関数を使い分けている方はほぼいないのではないかと思います。
と言うわけで、それぞれの関数にどのような特徴があるのか、調べてみました。
print_r、var_dump、var_exportの出力形式の違い
まずは、それぞれ配列を出力させてみて、どのような違いがあるかを確認します。
1 2 3 4 5 6 7 8 9 10 11 |
// 下記の配列を出力します。 $array = [ "aaa" => 123, "bbb" => "123", "ccc" => "123 ", "ddd" => "あああ", ]; print_r($array); var_dump($array); var_export($array); |
出力結果は以下の通りとなりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// print_r($array); Array ( [aaa] => 123 [bbb] => 123 [ccc] => 123 [ddd] => あああ ) // var_dump($array); array(4) { ["aaa"]=> int(123) ["bbb"]=> string(3) "123" ["ccc"]=> string(4) "123 " ["ddd"]=> string(9) "あああ" } // var_export($array); array ( 'aaa' => 123, 'bbb' => '123', 'ccc' => '123 ', 'ddd' => 'あああ', ) |
出力結果の違いとしては、以下のような感じです。
「print_r()」は、非常にシンプル。また、「ccc」にある空白が確認出来ないためデバッグに使うには問題がありそうです。
「var_dump()」は、数値と認識されているか、文字と認識されているかの違いや、文字数(桁数)も確認出来ます。また、「ccc」の空白も確認出来ます。
「var_export()」は、文字数は分かりませんが、「ccc」の空白を確認することができます。最大の特徴は、出力された配列をそのまま PHPの配列として再利用できる点です。
(入力した変数と同じ形式ですので、PHPの配列としてコピペして使用できます。)
ちなみに、「echo」は配列を扱えないため、デバッグに使用するにはかなり限定的な使用になるかと思います。
print_r、var_dump、var_exportの出力先の違い・戻り値を受け取れるか
「print_r()」「var_dump()」「var_export()」の機能の違いとしては、戻り値を返す機能があるかどうか、です。
デフォルトでは、いずれも標準出力(画面に出力)する使用になっていますが、画面に表示する内容を戻り値として受け取り、変数に格納することができるか否か、の機能が異なります。
「print_r()」「var_export()」は、戻り値を受け取ることが出来ます。
「var_dump()」は、戻り値を受け取る仕様がありません。
1 2 |
$response = print_r($array, true); $response = var_export($array, true); |
「print_r()」「var_export()」は、上記のように第 2引数(パラメータ)に「true」を指定することで、標準出力ではなく、戻り値として戻すようになりますので、その値を変数に格納することが出来ます。
CakePHP4でログ出力に際しては、直接配列を扱えなくなりましたので、「var_export()」を使う必要が出てきましたが、CakePHP4のログ出力に関しては下記に記事を書いていますので併せて参考にしてください。
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
print_r、var_dump、var_exportの動作の違いのまとめ
上記の違いから、デバッグをする際に標準出力を行って確認をする場合は、「var_dump()」「var_export()」が有用だと思います。
ですが、ログ出力をする際に戻り値を必要とする場合は、「var_export()」を使うことになります。
(「print_r()」では出力される情報が不足しているため、確実なデバッグには難があるといわざるを得ません。)
と言うわけで、デバッグに使うなら「var_export()」がオススメ!って事になりますね。
かく言う私は「print_r()」を使っていた
かく言う私は「print_r()」をずっと使っていましたが、他の関数の仕様を詳しく調べることなくこれまで過ごしてきました。
特に不便に思うこともなかったわけですが、CakePHP4でログ出力する際に配列を扱う場合は「var_export()」を使う使う必要があるため、『「print_r()」と「var_export()」は、何が違うんだ?』と思ったことがきっかけでした。
ですが、しっかり調べてみると、「print_r()」を使うメリットが見えないな、と改めて思った次第です。
参考サイト
「var_export()」
https://www.php.net/manual/ja/function.var-export.php
一番最初に「var_export() は、 渡された変数に関する構造化された情報を返します。この関数は var_dump() に似ていますが、 返される表現が有効な PHP コードであるところが異なります。」と書いてありますので、明確な目的がある関数ですね。
「print_r()」
https://www.php.net/manual/ja/function.print-r.php
「var_dump()」
https://www.php.net/manual/ja/function.var-dump.php
「ブラウザに直接結果を出力する すべてのものと同様に、出力制御関数 を使用してこの関数の出力をキャプチャーし、(例えば)文字列 (string)に保存することが可能です。」
と記載がある「出力制御(出力バッファリング)」に関しては下記に記事を書いていますので併せて参考にしてください。
ob_start、ob_get_contents関数でPHPの標準出力をバッファリング・変数に代入
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
カオナビAPI Ver.2.0のtokenを取得する PHP+cURLのサンプルプログラム
PHPのcURLを使用してカオナビAPIのアクセスに必要なtoken、シートの情報を取得するサンプルプログラムを作成。cURLの処理は関数化しているため他のAPIでも流用できる。
-
-
Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説
お問い合わせ等のメールフォームから送ったメールがスパム扱いされる!その対策としてライブラリ「Phpmailer」を使う方法を解説。関数化していますのでコピペでOK。
-
-
ECCUBEの新規追加ページがInternal Server Error・Not Foundに
ECCUBEで新規追加したページがInternal Server Errorに!原因はファイルのパーミッションの場合が多くその対処方法とプログラムの修正ポイントを解説。Not Foundも解説。
-
-
ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説
ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!
-
-
路線・駅検索のために緯度経度からPHPで2点間の距離を計算する処理解説
路線・駅検索の仕組みの構築は大変。それを簡易に実装するために緯度経度を元に距離計算をする仕組みを考案。まずは2点間の距離を計算する仕組みを解説し、距離計算にまつわる関連技術も紹介。
-
-
ECCUBEの商品一覧ページのSEO対策!rel=”next” rel=”prev”を設定
Googleは関連あるページはその旨明示するよう求めています。ECCUBEの商品一覧ページでその求めに応じるための「rel=”next”」「rel=”prev”」について解説します。
-
-
フォルダを指定してファイルのパーミッションを変更するプログラム
フォームからフォルダ、パーミッションを指定しパーミッションを変更するサンプルプログラムの解説です。
-
-
数値がMySQLのint(11)に保存できない!PHPの変数が本当にint型か確認!
PHPでintegerとdoubleが混在するような計算をする場合は要注意!計算結果が整数値であっても途中で使用する変数にdoubleの値が入っているときは計算結果がintegerではない場合があります。
-
-
Smartyの Syntax Errorの原因はスペースかも
Smartyのなかなか原因がつかめない Syntax Errorの原因はスペースかもしれません。
-
-
cURLを利用する際の注意点「
&
」があるURLは「”
」で囲むcURLでURLはダブルクォーテーションで囲む。LinuxでもWindowsでもコマンドでは「&」は意味を持つ文字のためエラー原因になる。クォーテーションは常につけておく方が無難。