var_dump
の出力を文字列にキャプチャしたいのですが。
PHP docsは言う。
結果を直接ブラウザに出力するものと同様に、 output-control関数 を使用してこの関数の出力を取得し、それを文字列に保存することができます(たとえば)。
それがどのように機能するかの例を誰かに教えてもらえますか?
print_r()
は、私に必要な情報を提供してくれるわけではないので、有効な可能性はありません。
出力バッファリングを使う:
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
var_export
を試してくださいvar_export
- をチェックアウトすることをお勧めします。var_dump
と同じ出力は提供されませんが、2番目の$return
パラメーターが提供されるため、出力ではなく出力が返されます。
$debug = var_export($my_var, true);
私はob_start
とob_get_clean()
を使うよりこのワンライナーを好みます。出力はPHPコードなので、読みやすくなっています。
var_dump
とvar_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);
$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,
)
$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
}
$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_dump
とprint_r
は、循環参照に遭遇すると文字列*RECURSION*
を出力します。
あなたもこれを行うことができます:
$dump = print_r($variable, true);
serialize()
functionを使うこともできますが、デバッグの目的ではとても便利です。
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();
}
echo json_encode($dataobject);
も役に立つかもしれません
この質問は古くなっていることを私は知っていますが、だれもこの点について言及していません。
この関数は、その型と値を含む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 '';
}
乾杯。
実行時に変数の内容を調べたい場合は、XDebugのような実際のデバッガを使用することを検討してください。そうすれば、ソースコードをめちゃくちゃにする必要がなくなり、通常のユーザーがアプリケーションにアクセスしている間でもデバッガを使用できます。気付かないでしょう。
これが機能としての完全な解決策です。
function varDumpToString ($var)
{
ob_start();
var_dump($var);
return ob_get_clean();
}
これはちょっとした話題かもしれません。
私はこの種の情報を私のPHP-FPMコンテナのDockerログに書き込む方法を探していて、以下の抜粋を思い付きました。これはDocker PHP-FPMユーザーが使用できると確信しています。
fwrite(fopen('php://stdout', 'w'), var_export($object, true));
私は本当に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, ['=>' => '=>']));
}
以下の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)
誰かに役立つことを願っています。