の出力を文字列にキャプチャしたいと思いvar_dump
ます。
PHPのドキュメントには次のように書かれています。
結果をブラウザに直接出力するものと同様に、output-control関数を使用して、この関数の出力をキャプチャし、文字列に保存できます(たとえば)。
それがどのように機能するかの例は何でしょうか?
print_r()
必要な情報が得られないため、有効な可能性ではありません。
の出力を文字列にキャプチャしたいと思いvar_dump
ます。
PHPのドキュメントには次のように書かれています。
結果をブラウザに直接出力するものと同様に、output-control関数を使用して、この関数の出力をキャプチャし、文字列に保存できます(たとえば)。
それがどのように機能するかの例は何でしょうか?
print_r()
必要な情報が得られないため、有効な可能性ではありません。
var_export
チェックアウトすることをお勧めします— 2番目のパラメーターを提供var_export
するのと同じ出力を提供しませんが、出力を出力するのではなく返すようにします。var_dump
$return
$debug = var_export($my_var, true);
ob_start
とを使用するよりも、このワンライナーの方が好きob_get_clean()
です。また、PHPコードであるため、出力が少し読みやすくなっていることもわかりました。
var_dump
との違いは、単に変数に関する情報をダンプしながら、「変数の解析可能な文字列表現」var_export
をvar_export
返すことです。これが実際に意味することは、有効なPHPコードを提供することです(ただし、特にリソースを使用している場合は、変数に関する情報がそれほど多くない場合があります)。var_dump
var_export
$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*
出力バッファリングを使用します。
<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
これを行うこともできます:
$dump = print_r($variable, true);
PHP>=7.0.0 を使用している場合
function return_var_dump(...$args): string
{
ob_start();
try {
var_dump(...$args);
return ob_get_clean();
} catch (\Throwable $ex) {
// PHP8 ArgumentCountError for 0 arguments, probably..
// in php<8 this was just a warning
ob_end_clean();
throw $ex;
}
}
または PHP >=5.3.0 を使用している場合:
function return_var_dump(){
ob_start();
call_user_func_array('var_dump', func_get_args());
return ob_get_clean();
}
または PHP<5.3.0 を使用している場合 (この関数は、実際には PHP4 まで互換性があります)
function return_var_dump(){
$args = func_get_args(); // For <5.3.0 support ...
ob_start();
call_user_func_array('var_dump', $args);
return ob_get_clean();
}
(5.3.0 より前では、別の関数呼び出しの引数として直接使用すると func_get_args にバグがあったため、引数として直接使用する代わりに、変数に入れて変数を使用する必要がありました..)
機能を使用することもできserialize()
ます。デバッグ目的で非常に役立つ場合があります。
またecho json_encode($dataobject);
、役に立つかもしれません
実行時に変数の内容を確認したい場合は、XDebugなどの実際のデバッガーの使用を検討してください。そうすれば、ソースコードを台無しにする必要がなく、通常のユーザーがアプリケーションにアクセスしているときでもデバッガーを使用できます。彼らは気づかないでしょう。
関数としての完全なソリューションは次のとおりです。
function varDumpToString ($var)
{
ob_start();
var_dump($var);
return ob_get_clean();
}
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 }