Làm thế nào tôi có thể nắm bắt kết quả của var_dump thành một chuỗi?


605

Tôi muốn nắm bắt đầu ra của var_dumpmột chuỗi.

Tài liệu PHP nói;

Như với bất cứ điều gì đưa kết quả của nó trực tiếp đến trình duyệt, các chức năng kiểm soát đầu ra có thể được sử dụng để nắm bắt đầu ra của chức năng này và lưu nó trong một chuỗi (ví dụ).

Điều gì sẽ là một ví dụ về cách nó có thể hoạt động?

print_r() không phải là một khả năng hợp lệ, bởi vì nó sẽ không cung cấp cho tôi thông tin mà tôi cần.

Câu trả lời:


601

Sử dụng bộ đệm đầu ra:

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

8
Sử dụng bộ đệm đầu ra rất có thể sẽ có ảnh hưởng tiêu cực đến hiệu suất ở đây. Nó cũng có thể trở nên thực sự lộn xộn nếu bạn cần xem xét nhiều biến trong quá trình thực thi một tập lệnh phức tạp.
selfawaresoup

83
@Inwdr Tôi chỉ từng sử dụng var_dump như một tính năng tiện lợi để gỡ lỗi và chắc chắn không bao giờ để lại các câu lệnh var_dump trong mã sản xuất. Tôi tưởng tượng điều này là điển hình. Trong những trường hợp đó, hiệu suất dường như không có liên quan.
Đánh dấu Amery

cũng loại bỏ các thẻ để dễ đọc (nếu bạn chỉ muốn chuỗi), bằng cách sử dụng strip_tags(), điều này sẽ chỉ trả về loại và giá trị.
Anil

11
Đây là một câu trả lời đúng theo nghĩa đen cho câu hỏi, vì bạn 'captur [ing] kết quả của một var_dump thành một chuỗi' chính xác như những gì được hỏi. var_export () là một câu trả lời tốt hơn về mặt tinh thần, vì nó có ý nghĩa hơn nói chung.
Josh từ Qaribou

1
@AlbertHendriks Tôi thích var_dump. Với Xdebug được kích hoạt, bạn sẽ có được một dữ liệu hiển thị đẹp.
robsch

880

Thử var_export

Bạn có thể muốn kiểm tra var_export- trong khi nó không cung cấp cùng một đầu ra vì var_dumpnó cung cấp một $returntham số thứ hai sẽ khiến nó trả về đầu ra của nó thay vì in nó:

$debug = var_export($my_var, true);

Tại sao?

Tôi thích cái lót này để sử dụng ob_startob_get_clean(). Tôi cũng thấy rằng đầu ra dễ đọc hơn một chút, vì nó chỉ là mã PHP.

Sự khác biệt giữa var_dumpvar_exportvar_exporttrả về "biểu diễn chuỗi có thể phân tích cú pháp của một biến" trong khi var_dumpchỉ cần bỏ thông tin về một biến. Điều này có nghĩa trong thực tế là var_exportcung cấp cho bạn mã PHP hợp lệ (nhưng có thể không cung cấp cho bạn nhiều thông tin về biến, đặc biệt nếu bạn đang làm việc với các tài nguyên ).

Bản giới thiệu:

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

Sự khác biệt về đầu ra:

var_export ( $debug_exporttrong ví dụ trên):

 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_dumptrong ví dụ trên):

 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_printrtrong ví dụ trên):

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

    [object] => stdClass Object
        (
        )

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

Hãy cẩn thận: var_exportkhông xử lý các tham chiếu tròn

Nếu bạn đang cố gắng kết xuất một biến với các tham chiếu vòng tròn, hãy gọi var_export sẽ dẫn đến cảnh báo PHP:

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

Kết quả trong:

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

Cả hai var_dumpprint_r, mặt khác, sẽ xuất chuỗi *RECURSION*khi gặp các tham chiếu tròn.


11
Đây chắc chắn là một câu trả lời tốt hơn so với câu trả lời được chấp nhận. Tôi ngạc nhiên khi nó không có nhiều upvote! Bạn có thể giải thích lý do tại sao nó có thể không cung cấp tất cả thông tin anh ấy đang tìm kiếm?
JMTyler

7
@JMTyler var_export trả về một chuỗi có thể phân tích được về cơ bản là mã PHP trong khi var_dump cung cấp kết xuất dữ liệu thô. Vì vậy, ví dụ, nếu bạn gọi var_dump trên một số nguyên có giá trị là 1, nó sẽ in int(1)trong khi var_export chỉ in ra 1.
inxilpro

4
var_export đáp xuống bụng của nó nếu bạn sử dụng nó với $ GLOBALS trong khi var_dump hoạt động.
Olaf

3
sẽ không hoạt động với các biến chứa tham chiếu đến chính nó .. var_export không hoạt động như var_dump; như thế này, $ v = []; $ v [] = & $ v; var_export ($ v, true); ...
hanshenrik

3
Ngừng thổi phồng mọi người. var_exportthực sự không tốt hơn để gỡ lỗi vì bạn không thể thực hiện tìm kiếm trình duyệt (int)hoặc (chuỗi) `và v.v. Nó cũng mang nhiều thông tin vào một không gian nhỏ, chỉ cần thử : var_export(''); var_export('\'');. Và quan trọng nhất, hãy sẵn sàng cho lỗi PHP Fatal: Mức lồng nhau quá sâu - phụ thuộc đệ quy? trong C: \ path \ file.php trên dòng 75
Pacerier

76

Bạn cũng có thể làm điều này:

$dump = print_r($variable, true);

17
Tôi đã đặc biệt đề cập đến var_dump mặc dù :)
Mark Biek

7
Cá nhân tôi thích sử dụng những print_rnơi tôi có thể, nhưng thật không may, đôi khi nó không cung cấp đủ thông tin. Chẳng hạn, vì nó chuyển thành chuỗi ở nơi có thể, cả hai falsenullhiển thị dưới dạng một chuỗi trống. Trong trường hợp tôi quan tâm đến sự khác biệt giữa những điều này, tôi sẽ cố gắng dùng đến var_dumphoặc var_export.
JMTyler


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();
}

4
@MarkAmery Có vẻ đúng. Tôi chỉ làm cho nó dễ dàng.
hanshenrik

13

Cũng echo json_encode($dataobject);có thể hữu ích


1
Trong trường hợp này, đầu ra rất khó hiểu và khác xa với mục đích gỡ lỗi theo ý kiến ​​của tôi.
Tomáš Zato - Phục hồi Monica

2
Mark Biek không nói gì về gỡ lỗi, phải không? Có lẽ anh ta chỉ cần đối tượng lưu trong DB. Trong trường hợp này phương pháp được cung cấp của tôi sẽ hoạt động tốt. Cảm ơn vì đã đứng đầu, Tomáš Zato.
ZurabWeb

Dù sao, json_encodesẽ không chứa tất cả các dữ liệu var_dump(ví dụ như các loại biến). json_encodexuất ra thông tin giống như print_R, inly ở định dạng khác nhau.
Tomáš Zato - Phục hồi Monica

1
Ok, tôi sẽ giải thích nó một lần nữa . Cựu ước nói rằng ông cần đầu ra var_dump. Ông cũng tuyên bố rằng print_Rcung cấp không đủ thông tin cho nhu cầu của mình. Không có sự khác biệt thực sự trong thông tin được cung cấp bởi json_encodeprint_r- chỉ có định dạng dữ liệu là khác nhau. Cho điều này, nếu print_rkhông đủ, thì cũng vậy json_encode. Xin đừng phàn nàn về downvote nữa. Nó rõ ràng không chỉ là nhấp chuột ngẫu nhiên, vì vậy hãy đối phó với nó.
Tomáš Zato - Phục hồi Monica

9

Từ hướng dẫn PHP :

Hàm này hiển thị thông tin có cấu trúc về một hoặc nhiều biểu thức bao gồm loại và giá trị của nó.

Vì vậy, đây là phiên bản trả về thực sự của PHP var_dump(), thực sự chấp nhận danh sách đối số có độ dài thay đổi:

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

1
+1 để cung cấp Câu trả lời thực sự cho câu hỏi thực tế. Tôi đang đọc điều này bởi vì tôi cần var_dump, không phải var_export, print_r, serialize, json_encode hoặc trình gỡ lỗi thực sự. Tôi biết làm thế nào để sử dụng chúng, quá. OP yêu cầu var_dump, tôi cần var_dump. Cảm ơn bạn!
Slashback

nếu bạn muốn giữ đúng với var_dump, bạn phải kích hoạt_error ("Số tham số sai cho var_dump_str ()"); khi argc <= 0; hoặc tốt hơn nữa, có var_dump làm điều đó cho bạn. : p
hanshenrik

Điều này cho biết thêm không có gì chưa có trong câu trả lời được chấp nhận. Các $argckiểm tra ở đây là không cần thiết và cho là không chính xác như ra nhọn bởi @hanshenrik, và một khi bạn lấy đi tất cả mà bạn đang thực sự thêm là call_user_func_arrayfunc_get_argscác cuộc gọi.
Đánh dấu Amery

5

Nếu bạn muốn xem nội dung của một biến trong thời gian chạy, hãy xem xét sử dụng trình gỡ lỗi thực sự như XDebug. Bằng cách đó, bạn không cần phải làm rối mã nguồn của mình và bạn có thể sử dụng trình gỡ lỗi ngay cả khi người dùng bình thường truy cập ứng dụng của bạn. Họ sẽ không thông báo.


5

Đây là giải pháp hoàn chỉnh như một hàm:

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

2
sẽ không hoạt động với nhiều hơn 1 biến ... var_dump ("foo", "bar") => chuỗi (3) "foo" chuỗi (3) "bar" varDumpToString ("foo", "bar") => chuỗi (3) "foo"
hanshenrik

2

Điều này có thể hơi lạc đề.

Tôi đang tìm cách viết loại thông tin này vào nhật ký Docker của bộ chứa PHP-FPM của tôi và đưa ra đoạn trích dưới đây. Tôi chắc chắn điều này có thể được sử dụng bởi người dùng Docker PHP-FPM.

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

1
tay cầm không bao giờ đóng tho, vì vậy đây là một rò rỉ tài nguyên, có thể là một vấn đề trong các tập lệnh kiểu daemon chạy dài. nhưng hãy thửfile_put_contents('php://stdout',var_export($object, true),FILE_APPEND);
hanshenrik

0

Tôi thực sự thích var_dump()đầu ra dài dòng và không hài lòng với var_export()hoặcprint_r() đầu ra là bởi vì nó không cung cấp càng nhiều thông tin (ví dụ như kiểu dữ liệu mất tích, chiều dài mất tích).

Để viết mã an toàn và có thể dự đoán được, đôi khi việc phân biệt giữa một chuỗi rỗng và null là rất hữu ích. Hoặc giữa 1 và đúng. Hoặc giữa null và false. Vì vậy, tôi muốn loại dữ liệu của tôi trong đầu ra.

Mặc dù hữu ích, tôi đã không tìm thấy một giải pháp đơn giản và sạch sẽ trong các phản hồi hiện có để chuyển đổi đầu ra có màu thành đầu ra var_dump()có thể đọc được thành chuỗi mà không có thẻ html và bao gồm tất cả các chi tiết từvar_dump() .

Lưu ý rằng nếu bạn có màu var_dump(), điều đó có nghĩa là bạn đã cài đặt Xdebug, ghi đè mặc định của php var_dump()để thêm màu html.

Vì lý do đó, tôi đã tạo ra biến thể nhỏ này đưa ra chính xác những gì tôi cần:

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

Trả về chuỗi đẹp dưới đây:

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)

Hy vọng nó sẽ giúp được ai đó.


-2

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

Các hàm var_dump và print_r chỉ có thể xuất trực tiếp ra trình duyệt. Vì vậy, đầu ra của các hàm này chỉ có thể được truy xuất bằng cách sử dụng các hàm điều khiển đầu ra của php. Phương pháp dưới đây có thể hữu ích để lưu đầu ra.

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

ob_get_clean () chỉ có thể xóa dữ liệu cuối cùng được nhập vào bộ đệm nội bộ. Vì vậy, phương thức ob_get_contents sẽ hữu ích nếu bạn có nhiều mục.

Từ cùng một nguồn như trên:

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
}

1
Vui lòng cho biết chính xác khi bạn trích dẫn tài liệu từ một nguồn khác. Trước khi chỉnh sửa tôi sắp thực hiện, phần duy nhất của câu trả lời này được định dạng như một trích dẫn là phần bạn không sao chép và dán từ blog của ai đó.
Đánh dấu Amery

-2

Chuỗi dài : Chỉ cần sử dụng echo($var);thay vì dump($var);.

Vật hoặc mảng :var_dump('<pre>'.json_encode($var).'</pre>);'

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.