var_dumpの結果を文字列にキャプチャするにはどうすればよいですか?


605

の出力をキャプチャしたい var_dump文字列へですが。

PHPのドキュメントによれば、

結果を直接ブラウザに出力するものと同様に、出力制御関数を使用して、この関数の出力をキャプチャし、それを文字列(たとえば)に保存できます。

それがどのように機能するかの例は何でしょうか?

print_r() 必要な情報が得られないため、これは妥当な可能性ではありません。

回答:


601

出力バッファリングを使用します。

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>

8
ここでは、出力バッファリングを使用すると、パフォーマンスに悪影響を及ぼす可能性があります。また、複雑なスクリプトの実行中に複数の変数を調べる必要がある場合も、非常に厄介になることがあります。
selfawaresoup 2009

83
@Inwdrデバッグのための便利な機能としてvar_dumpを使用したことがあり、製品コードにvar_dumpステートメントを残したことはありません。これは典型的だと思います。これらの状況では、パフォーマンスがまったく関係ない可能性があります。
Mark Amery 2013

また、読みやすくするためにタグを削除します(文字列だけが必要な場合)strip_tags()。これを使用すると、タイプと値が返されます。
2013年

11
質問されたとおりに「文字列にvar_dumpの結果をキャプチャ」しているので、これは質問に対する適切な文字どおりの回答です。var_export()は、一般的に意味をなすため、精神的にはより良い答えです。
ジョリー、カリボウ2014

1
@AlbertHendriks私はvar_dumpを好みます。Xdebugを有効にすると、きれいなデータが表示されます。
robsch 2017年

880

試す var_export

チェックアウトすることをお勧めします。これは、出力ではなく出力を返す2番目のパラメーターをvar_export提供するのと同じ出力を提供しません。var_dump$return

$debug = var_export($my_var, true);

どうして?

とを使用するよりも、このワンライナーを使用ob_startob_get_clean()ます。また、PHPコードであるため、出力が少し読みやすくなっています。

違いvar_dumpvar_exportすなわちvar_exportリターン「変数の解析可能な文字列表現」しながらvar_dump、単に変数に関する情報をダンプ。これが実際に意味することは、var_export有効なPHPコードを提供することです(ただし、特にリソースを使用している場合は、変数に関する情報がそれほど多くない場合があります)。

デモ:

$demo = array(
    "bool" => false,
    "int" => 1,
    "float" => 3.14,
    "string" => "hello world",
    "array" => array(),
    "object" => new stdClass(),
    "resource" => tmpfile(),
    "null" => null,
);

// var_export -- nice, one-liner
$debug_export = var_export($demo, true);

// var_dump
ob_start();
var_dump($demo);
$debug_dump = ob_get_clean();

// print_r -- included for completeness, though not recommended
$debug_printr = print_r($demo, true);

出力の違い:

var_export($debug_export上記の例):

 array (
  'bool' => false,
  'int' => 1,
  'float' => 3.1400000000000001,
  'string' => 'hello world',
  'array' => 
  array (
  ),
  'object' => 
  stdClass::__set_state(array(
  )),
  'resource' => NULL, // Note that this resource pointer is now NULL
  'null' => NULL,
)

var_dump($debug_dump上記の例):

 array(8) {
  ["bool"]=>
  bool(false)
  ["int"]=>
  int(1)
  ["float"]=>
  float(3.14)
  ["string"]=>
  string(11) "hello world"
  ["array"]=>
  array(0) {
  }
  ["object"]=>
  object(stdClass)#1 (0) {
  }
  ["resource"]=>
  resource(4) of type (stream)
  ["null"]=>
  NULL
}

print_r($debug_printr上記の例):

Array
(
    [bool] => 
    [int] => 1
    [float] => 3.14
    [string] => hello world
    [array] => Array
        (
        )

    [object] => stdClass Object
        (
        )

    [resource] => Resource id #4
    [null] => 
)

警告:var_export循環参照を処理しません

循環参照で変数をダンプしようとしている場合は、 var_exportによりPHP警告が発生します。

 $circular = array();
 $circular['self'] =& $circular;
 var_export($circular);

結果:

 Warning: var_export does not handle circular references in example.php on line 3
 array (
   'self' => 
   array (
     'self' => NULL,
   ),
 )

両方var_dumpprint_r、一方で、意志の出力文字列*RECURSION*循環参照に遭遇しました。


11
これは間違いなく受け入れられたものより良い答えです。それ以上の投票がないことに驚いています!彼が探しているすべての情報が得られない理由を詳しく教えてください。
JMTyler 2013年

7
@JMTylerでvar_export戻る構文解析可能な文字列本質的にPHPコードながらのvar_dumpデータの生のダンプを提供します。したがって、たとえば、値が1の整数に対してvar_dumpを呼び出すと、int(1)var_exportが出力するだけで出力され1ます。
inxilpro 2013年

4
var_dumpが機能しているときに$ GLOBALSと一緒に使用すると、var_exportが腹に落ちます。
オラフ

3
それ自体への参照を含む変数では機能しません。var_exportはvar_dumpのようには機能しません。このように、$ v = []; $ v [] =&$ v; var_export($ v、true); ...
hanshenrik 2014年

3
人をからかうのをやめなさい。または(文字列) `などのvar_exportブラウザー検索を実行できなかったため、実際にはデバッグには適していません(int)。また、多くの情報を小さなスペースに変換しますvar_export(''); var_export('\'');。そして最も重要なのは、PHPの致命的なエラーの準備をすることですネストレベルが深すぎます-再帰的な依存関係?C:\ path \
file.phpの

76

これを行うこともできます:

$dump = print_r($variable, true);

17
私は特にvar_dumpについて具体的に言及しました:)
Mark Biek

7
個人的print_rにはできる限り使用することを好みますが、残念ながら十分な情報が得られない場合があります。例えば、どこそれができる、それが文字列にキャストするので、両方falsenull空の文字列として表示されます。これらの違いを気にする場合は、不本意ながらvar_dumpまたはに頼るでしょうvar_export
JMTyler 2013年

15

serialize()関数を使用することもできます。時にはそれはデバッグの目的で非常に役立ちます。


7
警告:文字列として出力error_logする必要がある場合は、このソリューションを使用しないでください。シリアライズの出力にはnullバイトが含まれる場合があり、nullバイトをerror_log 含む文字列が切り捨てられるためです。
マークアメリー2014

15
function return_var_dump(){
    // It works like var_dump, but it returns a string instead of printing it.
    $args = func_get_args(); // For <5.3.0 support ...
    ob_start();
    call_user_func_array('var_dump', $args);
    return ob_get_clean();
}

4
@MarkAmeryは本当らしい。簡単にしました。
hanshenrik 2014年

13

またecho json_encode($dataobject);役立つかもしれません


1
この場合、出力は非常にわかりにくく、デバッグの目的から遠く離れていると思います。
トマーシュZato -復活モニカ

2
マーク・ビエックはデバッグについて何も言わなかったでしょう?多分彼はただDBに保存されたオブジェクトを必要としています。この場合、私の提供する方法がうまく機能します。とにかく頭を上げてくれてありがとう、トマシュ・ザト。
ZurabWeb 2013

とにかく、json_encodeすべてのデータvar_dumpが含まれるわけではありません(たとえば、変数型として)。json_encodeと同じ情報をprint_R、異なる形式で出力します。
トマーシュZato -復活モニカ

1
わかりました、もう一度説明します。OTは、彼がの出力を必要としていると述べましたvar_dump。またprint_R、彼のニーズには不十分な情報しか提供していないと述べました。json_encodeおよびによって提供される情報に実際の違いはありませんprint_r。データ形式のみが異なります。これを考えると、print_r不十分な場合はそうですjson_encode。もう反対票について文句を言わないでください。それは明らかにランダムなクリックではなかったので、それに対処してください。
トマーシュZato -復活モニカ

9

PHPマニュアルから

この関数は、そのタイプと値を含む1つ以上の式に関する構造化情報を表示します。

だから、ここで本当の PHPのの戻りバージョンvar_dump()、実際に可変長引数リストを受け入れ、:

function var_dump_str()
{
    $argc = func_num_args();
    $argv = func_get_args();

    if ($argc > 0) {
        ob_start();
        call_user_func_array('var_dump', $argv);
        $result = ob_get_contents();
        ob_end_clean();
        return $result;
    }

    return '';
}

1
+1は、実際の質問に対する実際の回答を提供します。私が読んでいるのは、var_export、print_r、serialize、json_encode、または実際のデバッガではなく、var_dumpが必要だからです。私もそれらの使い方を知っています。OPがvar_dumpを要求しました。var_dumpが必要です。ありがとうございました!
スラッシュバック、2015年

var_dumpにtrueを維持したい場合は、trigger_error( "var_dump_str()の間違ったパラメーターカウント")を行う必要があります。argc <= 0の場合; または、より良い方法として、var_dumpにそれを実行させる。:p
hanshenrik

これは、受け入れられた回答にまだなかったものをほとんど追加しません。$argc@hanshenrikによって指摘されたように、ここでのチェックは不要であり、間違いなく間違いです。一度それを取り除くと、実際に追加するのはcall_user_func_arrayおよびfunc_get_args呼び出しだけです。
Mark Amery 2016年

5

実行時に変数の内容を確認したい場合は、XDebugなどの実際のデバッガーの使用を検討してください。そうすれば、ソースコードをめちゃくちゃにする必要がなくなり、通常のユーザーがアプリケーションにアクセスしているときでもデバッガーを使用できます。彼らは気づかないでしょう。


5

関数としての完全なソリューションは次のとおりです。

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}

2
複数の変数では機能しません... var_dump( "foo"、 "bar")=> string(3) "foo" string(3) "bar" varDumpToString( "foo"、 "bar")=> string(3) "foo"
hanshenrik

2

これはおそらく少しずれたトピックです。

この種の情報を私のPHP-FPMコンテナーのDockerログに書き込む方法を探していて、以下のスニペットを考え出しました。これはDocker PHP-FPMユーザーが使用できると確信しています。

fwrite(fopen('php://stdout', 'w'), var_export($object, true));

1
ハンドルは決して閉じられないので、これはリソースリークであり、デーモンスタイルのスクリプトを長時間実行すると問題になる可能性があります。試してみてくださいfile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik

0

私はvar_dump()の詳細出力が本当に好きで、情報が不足しているため(たとえば、データ型が不足している、長さが不足しているなど)、var_export()sまたはprint_r()の出力に満足していませんでした。

安全で予測可能なコードを記述するために、空の文字列とnullを区別すると役立つ場合があります。または、1とtrueの間。またはnullとfalseの間。だから私は私のデータタイプを出力に入れたいです。

有用ではありますが、色付きの出力をvar_dump()人間が読める形式の出力にHTMLタグなしの文字列に変換し、var_dump()

あなたが色付けされている場合var_dump()、それはあなたがvar_dump()htmlの色を追加するためにphpのデフォルトを上書きするXdebugがインストールされていることを意味することに注意してください。

そのため、このわずかなバリエーションを作成して、必要なものを正確に提供しました。

function dbg_var_dump($var)
    {
        ob_start();
        var_dump($var);
        $result = ob_get_clean();
        return strip_tags(strtr($result, ['=&gt;' => '=>']));
    }

以下の素敵な文字列を返します:

array (size=6)
  'functioncall' => string 'add-time-property' (length=17)
  'listingid' => string '57' (length=2)
  'weekday' => string '0' (length=1)
  'starttime' => string '00:00' (length=5)
  'endtime' => string '00:00' (length=5)
  'price' => string '' (length=0)

それが誰かを助けることを願っています。


-2

http://htmlexplorer.com/2015/01/assign-output-var_dump-print_r-php-variable.htmlから:

var_dump関数とprint_r関数は、ブラウザに直接出力することしかできません。したがって、これらの関数の出力は、phpの出力制御関数を使用してのみ取得できます。以下の方法は、出力を保存するのに役立ちます。

function assignVarDumpValueToString($object) {
    ob_start();
    var_dump($object);
    $result = ob_get_clean();
    return $result;
}

ob_get_clean()は、内部バッファに入力された最後のデータのみをクリアできます。したがって、複数のエントリがある場合、ob_get_contentsメソッドが役立ちます。

上記と同じソースから:

function varDumpToErrorLog( $var=null ){
    ob_start();                    // start reading the internal buffer
    var_dump( $var);          
    $grabbed_information = ob_get_contents(); // assigning the internal buffer contents to variable
    ob_end_clean();                // clearing the internal buffer.
    error_log( $grabbed_information);        // saving the information to error_log
}

1
別のソースからの資料を引用する場合は、適切に示してください。これから編集する前に、引用としてフォーマットされたこの回答の唯一の部分は、誰かのブログからコピーして貼り付けなかった部分です。
Mark Amery 2016年

-2

長い文字列:のecho($var);代わりに使用しますdump($var);

オブジェクトまたは配列var_dump('<pre>'.json_encode($var).'</pre>);'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.