web-dev-qa-db-ja.com

Var_dumpの結果を文字列にキャプチャする方法を教えてください。

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

PHP docsは言う。

結果を直接ブラウザに出力するものと同様に、 output-control関数 を使用してこの関数の出力を取得し、それを文字列に保存することができます(たとえば)。

それがどのように機能するかの例を誰かに教えてもらえますか?

print_r()は、私に必要な情報を提供してくれるわけではないので、有効な可能性はありません。

557
Mark Biek

出力バッファリングを使う:

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

var_export を試してください

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

$debug = var_export($my_var, true);

どうして?

私はob_startob_get_clean()を使うよりこのワンライナーを好みます。出力はPHPコードなので、読みやすくなっています。

var_dumpvar_exportの違いは、var_export "解析可能な文字列表現" を返すのに対し、var_dumpは単に変数に関する情報をダンプすることです。これが実際に意味することはvar_exportがあなたに有効なPHPコードを与えるということです(しかし、特にあなたが resources を使っているならば、あなたは変数に関してあなたに同じくらい多くの情報を与えないかもしれません)。

デモ:

$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*を出力します。

807
inxilpro

あなたもこれを行うことができます:

$dump = print_r($variable, true);
67
Ian P

serialize() functionを使うこともできますが、デバッグの目的ではとても便利です。

15
function return_var_dump(){
    //works like var_dump, but 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();
}
13
hanshenrik

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

12
ZurabWeb

この質問は古くなっていることを私は知っていますが、だれもこの点について言及していません。

PHPマニュアルから

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

それで、これはPHPのvar_dump() real returnバージョンです。これは実際には可変長の引数リストを受け付けます。

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 '';
}

乾杯。

7
YouniS Bensalah

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

5
selfawaresoup

これが機能としての完全な解決策です。

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

これはちょっとした話題かもしれません。

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

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

私は本当にvar_dump()の冗長出力が好きで、var_export()print_r()の出力に満足していませんでした。

安全で予測可能なコードを作成するために、空の文字列とnullを区別すると便利なことがあります。または1と真の間。あるいはnullとfalseの間です。だから私は私のデータ型が出力に欲しい。

有用ではありますが、var_dump()の色付きの出力を人間が読める形式の出力に、htmlタグのないvar_dump()の詳細をすべて含む文字列に変換するための明確で単純な解決策は見つかりませんでした。

色付きのvar_dump()がある場合は、HTMLの色を追加するためにphpのデフォルトのvar_dump()をオーバーライドするXdebugがインストールされていることを意味します。

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

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

以下のNice文字列を返します。

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)

誰かに役立つことを願っています。

0
Wadih M.