642

の出力を文字列にキャプチャしたいと思いvar_dumpます。

PHPのドキュメントには次のように書かれています。

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

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

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

4

13 に答える 13

922

試すvar_export

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

$debug = var_export($my_var, true);

なんで?

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

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

出力の違い:

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_dumpします。print_r*RECURSION*

于 2008-09-26T13:38:11.650 に答える
642

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

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
于 2008-09-26T13:25:22.900 に答える
82

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

$dump = print_r($variable, true);
于 2008-09-26T13:27:06.560 に答える
19

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 にバグがあったため、引数として直接使用する代わりに、変数に入れて変数を使用する必要がありました..)

于 2013-11-10T13:44:57.580 に答える
15

機能を使用することもできserialize()ます。デバッグ目的で非常に役立つ場合があります。

于 2008-09-29T02:41:46.103 に答える
14

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

于 2013-08-06T15:59:46.573 に答える
5

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

于 2009-12-27T16:47:29.890 に答える
5

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

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
于 2013-10-13T11:30:28.847 に答える
-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
}
于 2015-01-20T06:41:42.783 に答える