Contents

PHP var_dump 輸出到變數的方法

PHP 的 var_dump() 預設直接輸出到頁面,但在記錄 Log 時需要把輸出內容轉成字串。透過 Output Buffering 機制可以輕鬆解決這個問題。

Output Buffering 原理

PHP 的 Output Buffering(輸出緩衝)允許你暫時攔截所有輸出,先存到記憶體緩衝區中,再決定要輸出還是取出為字串。

核心函數:

  • ob_start():開啟輸出緩衝,之後的輸出不會直接送到瀏覽器
  • ob_get_clean():取得緩衝區內容並清空緩衝(等同於 ob_get_contents() + ob_end_clean()

var_dump 輸出到字串

1
2
3
4
5
6
7
<?php
ob_start();
var_dump($party);
$result = ob_get_clean();

// 現在 $result 是字串,可以記錄到 log
Log::write('result => ' . $result, 'debug');

其他常用函數搭配 Output Buffering

1
2
3
4
5
ob_start();
print_r($data);
$output = ob_get_clean();

error_log('Data: ' . $output);

print_r 也支援直接回傳字串的參數:

1
2
3
// 更簡單的寫法,不需要 ob_start
$output = print_r($data, true); // 第二個參數 true 表示回傳字串
error_log('Data: ' . $output);

var_export(輸出可執行的 PHP 語法)

1
2
3
// var_export 同樣支援 return 參數
$output = var_export($data, true);
error_log('Data: ' . $output);

var_export 的輸出是合法的 PHP 程式碼,適合用於序列化設定值。

三種函數比較

函數 顯示類型資訊 可回傳字串 輸出格式
var_dump ✓(含型別和長度) 需搭配 ob 詳細,含型別標示
print_r 部分 ✓(第二參數) 易讀,適合陣列
var_export ✓(第二參數) PHP 語法格式

實際應用場景

記錄 API 回傳資料到 Log

1
2
3
4
5
6
7
$response = json_decode($apiResult, true);

ob_start();
var_dump($response);
$dump = ob_get_clean();

Log::write('API Response: ' . $dump, 'api_debug');

將例外的詳細資訊記錄到 Log

1
2
3
4
5
6
try {
    // 可能拋出例外的程式碼
} catch (Exception $e) {
    $trace = $e->getTraceAsString();
    Log::write('Exception: ' . $e->getMessage() . "\n" . $trace, 'error');
}

在 CLI 腳本中輸出除錯資訊

1
2
3
4
5
// CLI 環境可以直接輸出,不需要 ob_start
var_dump($data);

// 或寫入標準錯誤輸出
fwrite(STDERR, print_r($data, true));

注意事項

  • ob_start() 可以巢狀使用,但要確保每個 ob_start() 都有對應的 ob_end_clean()ob_get_clean(),否則可能造成記憶體洩漏
  • 在使用 Session 或 Header 相關函數前,要確保緩衝區已清空
  • 生產環境建議使用專業的 Log 框架(如 Monolog),避免直接在頁面上顯示 var_dump