エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


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の出力形式の違い

 
まずは、それぞれ配列を出力させてみて、どのような違いがあるかを確認します。
 

// 下記の配列を出力します。
$array = [
  "aaa" => 123,
  "bbb" => "123",
  "ccc" => "123 ",
  "ddd" => "あああ",
];

print_r($array);
var_dump($array);
var_export($array);

 
 
出力結果は以下の通りとなりました。
 

// 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()」は、戻り値を受け取る仕様がありません。
 

$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の標準出力をバッファリング・変数に代入

 - PHP・Smarty・ECCUBE

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

XML形式の値を配列形式に変換・PHPでは simplexml_load_string()
XML形式の値を配列形式に変換・PHPでは simplexml_load_string()

XMLとは「Extensible Markup Language」の略でテキストベースのデータフォーマット。XMLをPHPで配列に変換するWebツールの紹介とその処理「simplexml_load_string()」関数についての解説。

ECCUBEの注文完了画面注文番号と商品情報を編集するCRITEO(クリテオ)タグを編集

ECCUBEの注文完了画面にクリテオのタグを編集する方法を紹介。標準機能では完了画面に注文IDや購入商品の情報を渡さないため改修が必要です。

乱数発生器(パスワード生成サービス)がバージョンアップで高速化!
乱数発生器(パスワード生成サービス)がバージョンアップで高速化!

乱数やパスワードを生成する乱数発生器を高速化!重複しない10桁、20桁の文字列を10万件、20万件と生成することも可能!イベントのキャンペーンのシリアルコードなどにも利用可能!

Phpmailerでスパム回避!Gmail等のSMTPを経由するPHPのメールフォーム解説

お問い合わせ等のメールフォームから送ったメールがスパム扱いされる!その対策としてライブラリ「Phpmailer」を使う方法を解説。関数化していますのでコピペでOK。

PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方
PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方

PHPのスクレイピングライブラリ「PHP Simple HTML DOM Parser」の使い方を解説。要素を取得する方法、そこから属性を取得する方法を解説。また、マニュアルにはない注意点なども解説。

QRコード(二次元バーコード)作成サービスを公開
QRコード(二次元バーコード)作成サービスを公開

QRコード(二次元バーコード)を生成するサービス。QRコードにする文字列を入力するだけで QRコードが簡単に作れる。オプションとして、画像サイズ、余白サイズ、エラー訂正レベルがある。

ECCUBEのポイント設定、ポイント付与率を一括で変更する方法解説

ECCUBEの商品個別に設定してあるポイントを一括で変更する方法を解説。ECCUBEには商品個別のポイントを一括して変更する機能がありません。SQLを作成して一括置換!

サーバ移転、PHPバージョンアップでPHPのソースコードが表示される・ショートタグのPHPが動かない

PHPでショートタグを使うのは危険。サーバ移転やバージョンアップで動かなくなる!ソースが丸見え、設定情報流出のリスクが!php.iniのshort_open_tagの設定を再確認。

ECCUBEの管理画面のSSL設定をインストール後に変更する方法

ECCUBEをインストールした後から管理画面のSSL設定を変更する方法を解説します。config.phpファイルのHTTPS_URLとADMIN_FORCE_SSLの値を変更すればOK。

Smartyのテンプレート内の処理で計算、加工をする方法

Smartyのテンプレート上で変数を計算する、加工する方法を解説します。