Bagaimana saya bisa menangkap hasil var_dump ke string?

605

Saya ingin menangkap output dari var_dumpsebuah string.

Dokumentasi PHP mengatakan;

Seperti apa pun yang menampilkan hasilnya langsung ke browser, fungsi kontrol-output dapat digunakan untuk menangkap output dari fungsi ini, dan menyimpannya dalam string (misalnya).

Apa yang akan menjadi contoh bagaimana cara kerjanya?

print_r() bukan kemungkinan yang valid, karena itu tidak akan memberi saya informasi yang saya butuhkan.

Mark Biek
sumber

Jawaban:

601

Gunakan buffering keluaran:

<?php
ob_start();
var_dump($someVar);
$result = ob_get_clean();
?>
Eran Galperin
sumber
8
Menggunakan buffering output kemungkinan besar akan berdampak negatif pada kinerja di sini. Itu juga bisa sangat berantakan jika Anda perlu melihat beberapa variabel selama eksekusi skrip yang kompleks.
selfawaresoup
83
@Inwdr Saya hanya pernah menggunakan var_dump sebagai fitur kenyamanan untuk debugging, dan tentu saja tidak pernah meninggalkan pernyataan var_dump dalam kode produksi. Saya membayangkan ini tipikal. Dalam keadaan itu, kinerja tidak mungkin sama sekali relevan.
Mark Amery
juga menghapus tag untuk dibaca (jika Anda hanya menginginkan string), menggunakan strip_tags(), ini hanya akan mengembalikan jenis dan nilai.
Anil
11
Ini adalah jawaban literal yang baik untuk pertanyaan, karena Anda 'menangkap hasil var_dump ke string' persis seperti apa yang ditanyakan. var_export () adalah jawaban yang lebih baik dalam semangat, karena lebih masuk akal secara umum.
Josh dari Qaribou
1
@AlbertHendriks Saya lebih suka var_dump. Dengan Xdebug diaktifkan Anda mendapatkan tampilan data yang cantik.
robsch
880

Mencoba var_export

Anda mungkin ingin check out var_export - meskipun tidak memberikan output yang sama seperti var_dumpitu memberikan $returnparameter kedua yang akan menyebabkannya mengembalikan output daripada mencetaknya:

$debug = var_export($my_var, true);

Mengapa?

Saya lebih suka one-liner ini menggunakan ob_startdan ob_get_clean(). Saya juga menemukan bahwa outputnya sedikit lebih mudah dibaca, karena itu hanya kode PHP.

Perbedaan antara var_dumpdan var_exportadalah yang var_exportmengembalikan "representasi string parsable dari variabel" sementaravar_dump hanya membuang informasi tentang suatu variabel. Apa artinya ini dalam praktiknya adalah yang var_exportmemberi Anda kode PHP yang valid (tetapi mungkin tidak memberi Anda informasi sebanyak mungkin tentang variabel, terutama jika Anda bekerja dengan sumber daya ).

Demo:

$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);

Perbedaan dalam output:

var_export ( $debug_exportdalam contoh di atas):

 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_dumpdalam contoh di atas):

 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_printrdalam contoh di atas):

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

    [object] => stdClass Object
        (
        )

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

Peringatan: var_export tidak menangani referensi melingkar

Jika Anda mencoba untuk membuang variabel dengan referensi melingkar, panggilan var_exportakan menghasilkan peringatan PHP:

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

Hasil dalam:

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

Keduanya var_dumpdan print_r, di sisi lain, akan menampilkan string *RECURSION*ketika menemukan referensi melingkar.

inxilpro
sumber
11
Ini jelas merupakan jawaban yang lebih baik daripada yang diterima. Saya terkejut itu tidak memiliki lebih banyak upvotes! Bisakah Anda menguraikan mengapa itu mungkin tidak memberikan semua informasi yang dia cari?
JMTyler
7
@JMTyler var_export mengembalikan string yang dapat diuraikan - pada dasarnya kode PHP - sementara var_dump menyediakan dump data mentah. Jadi, misalnya, jika Anda memanggil var_dump pada bilangan bulat dengan nilai 1, itu akan dicetak int(1)sementara var_export hanya mencetak 1.
inxilpro
4
var_export mendarat dengan perutnya jika Anda menggunakannya dengan $ GLOBALS sementara var_dump bekerja.
Olaf
3
tidak akan berfungsi dengan variabel yang berisi referensi ke dirinya sendiri .. var_export tidak berfungsi seperti var_dump; seperti ini, $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
hanshenrik
3
Hentikan orang hyping . var_exporttidak benar-benar baik untuk debugging karena Anda tidak bisa melakukan pencarian peramban untuk (int)atau (string) `dan lain-lain juga Mangles banyak informasi ke dalam sebuah ruang kecil, hanya mencoba: var_export(''); var_export('\'');. Dan yang paling penting, bersiap-siap untuk kesalahan PHP Fatal: Tingkat Nesting terlalu dalam - ketergantungan rekursif? di C: \ path \ file.php on line 75
Pacerier
76

Anda juga bisa melakukan ini:

$dump = print_r($variable, true);
Ian P
sumber
17
Saya secara khusus menyebutkan var_dump :)
Mark Biek
7
Saya pribadi lebih suka menggunakan di print_rmana saya bisa, tetapi sayangnya terkadang tidak memberikan informasi yang cukup. Misalnya, karena dilemparkan ke string di mana ia bisa, keduanya falsedan nullditampilkan sebagai string kosong. Dalam kasus di mana saya peduli tentang perbedaan antara ini, saya akan dengan enggan menggunakan var_dumpatau var_export.
JMTyler
15

Anda juga dapat mencoba menggunakan serialize()fungsi ini. Terkadang ini sangat berguna untuk keperluan debugging.

Sergey Stolyarov
sumber
7
Sebuah kata peringatan - jika alasan Anda menginginkan output sebagai string adalah untuk error_logitu, Anda sebaiknya tidak menggunakan solusi ini, karena keluaran serialisasi dapat mengandung byte nol dan error_log memotong string yang mengandung byte nol .
Mark Amery
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();
}
hanshenrik
sumber
4
@MarkAmery Sepertinya benar. Saya hanya membuatnya mudah.
hanshenrik
13

Juga echo json_encode($dataobject);mungkin bisa membantu

ZurabWeb
sumber
1
Dalam hal ini, output sangat membingungkan dan jauh dari tujuan debug menurut saya.
Tomáš Zato - Reinstate Monica
2
Mark Biek tidak mengatakan apa pun tentang debugging, bukan? Mungkin dia hanya membutuhkan objek yang disimpan dalam DB. Dalam hal ini metode yang saya tawarkan akan bekerja dengan baik. Bagaimanapun, terima kasih untuk kepala, Tomáš Zato.
ZurabWeb
Lagi pula, json_encodetidak akan berisi semua data var_dump(sebagai tipe variabel misalnya). json_encodemenampilkan informasi yang sama dengan print_R, dalam format yang berbeda.
Tomáš Zato - Reinstate Monica
1
Ok, saya akan jelaskan sekali lagi . PL menyatakan bahwa ia membutuhkan hasil var_dump. Dia juga menyatakan bahwa print_Rmenyediakan informasi tidak cukup untuk kebutuhannya. Tidak ada perbedaan nyata dalam informasi yang disediakan oleh json_encodedan print_r- hanya format data yang berbeda. Mengingat ini, jika print_rtidak cukup, demikian juga json_encode. Tolong jangan mengeluh tentang downvote lagi. Jelas itu bukan sekadar klik acak, jadi atasi saja.
Tomáš Zato - Reinstate Monica
9

Dari manual PHP :

Fungsi ini menampilkan informasi terstruktur tentang satu atau lebih ekspresi yang mencakup jenis dan nilainya.

Jadi, inilah versi pengembalian nyata PHP var_dump(), yang sebenarnya menerima daftar argumen panjang variabel:

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 '';
}
Younis Bensalah
sumber
1
+1 untuk memberikan Jawaban Nyata untuk pertanyaan aktual. Saya membaca ini karena saya perlu var_dump, bukan var_export, print_r, serialize, json_encode, atau debugger nyata Saya tahu cara menggunakannya juga. OP meminta var_dump, saya perlu var_dump. Terima kasih!
Slashback
jika Anda ingin tetap setia pada var_dump, Anda harus trigger_error ("Parameter salah menghitung untuk var_dump_str ()"); ketika argc <= 0; atau lebih baik lagi, suruh var_dump melakukannya untuk Anda. : p
hanshenrik
Ini menambahkan hampir tidak ada yang belum ada dalam jawaban yang diterima. The $argccek di sini adalah tidak perlu dan bisa dibilang salah karena keluar menunjuk oleh @hanshenrik, dan setelah Anda mengambilnya semua Anda benar-benar menambahkan adalah call_user_func_arraydan func_get_argspanggilan.
Mark Amery
5

Jika Anda ingin melihat konten variabel selama runtime, pertimbangkan untuk menggunakan debugger nyata seperti XDebug. Dengan begitu Anda tidak perlu mengacaukan kode sumber Anda, dan Anda dapat menggunakan debugger bahkan ketika pengguna normal mengunjungi aplikasi Anda. Mereka tidak akan memperhatikan.

selfawaresoup
sumber
5

Berikut adalah solusi lengkap sebagai fungsi:

function varDumpToString ($var)
{
    ob_start();
    var_dump($var);
    return ob_get_clean();
}
Khandad Niazi
sumber
2
tidak akan berfungsi dengan lebih dari 1 variabel ... var_dump ("foo", "bar") => string (3) "foo" string (3) "bar" varDumpToString ("foo", "bar") => string (3) "foo"
hanshenrik
2

Ini mungkin agak keluar dari topik.

Saya sedang mencari cara untuk menulis informasi semacam ini ke log Docker dari wadah PHP-FPM saya dan muncul dengan potongan di bawah ini. Saya yakin ini bisa digunakan oleh pengguna Docker PHP-FPM.

fwrite(fopen('php://stdout', 'w'), var_export($object, true));
Charlie Vieillard
sumber
1
pegangannya tidak pernah ditutup, jadi ini adalah kebocoran sumber daya, yang mungkin menjadi masalah dalam skrip gaya daemon yang sudah berjalan lama. tapi cobafile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik
0

Saya sangat suka var_dump()keluaran verbose dan tidak puas dengan var_export()atauprint_r() keluaran 's karena tidak memberikan banyak informasi (misalnya jenis data yang hilang, panjang hilang).

Untuk menulis kode yang aman dan dapat diprediksi, kadang-kadang berguna untuk membedakan antara string kosong dan nol. Atau antara 1 dan true. Atau antara nol dan salah. Jadi saya ingin tipe data saya di output.

Meskipun bermanfaat, saya tidak menemukan solusi bersih dan sederhana dalam respons yang ada untuk mengubah output berwarna var_dump()menjadi output yang dapat dibaca manusia menjadi string tanpa tag html dan termasuk semua detail darivar_dump() .

Perhatikan bahwa jika Anda memiliki warna var_dump(), itu berarti Anda telah menginstal Xdebug yang menimpa default php var_dump()untuk menambahkan warna html.

Untuk alasan itu, saya membuat variasi kecil ini memberikan apa yang saya butuhkan:

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

Mengembalikan string yang bagus di bawah ini:

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)

Semoga ini bisa membantu seseorang.

Wadih M.
sumber
-2

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

Fungsi var_dump dan print_r hanya dapat menampilkan langsung ke browser. Jadi output dari fungsi-fungsi ini hanya dapat diambil dengan menggunakan fungsi kontrol output dari php. Metode di bawah ini mungkin berguna untuk menyimpan output.

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

ob_get_clean () hanya dapat menghapus data terakhir yang dimasukkan ke buffer internal. Jadi metode ob_get_contents akan berguna jika Anda memiliki beberapa entri.

Dari sumber yang sama seperti di atas:

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
}
Dev C
sumber
1
Harap tunjukkan dengan benar saat Anda mengutip bahan dari sumber lain. Sebelum edit yang akan saya buat, satu-satunya bagian dari jawaban ini yang diformat sebagai kutipan adalah bagian yang tidak Anda salin dan tempel dari blog seseorang.
Mark Amery
-2

Tali panjang : Cukup gunakan echo($var);saja dump($var);.

Obyek atau Array :var_dump('<pre>'.json_encode($var).'</pre>);'

vuchkov
sumber