核心差異一覽
| 特性 | echo | print_r() | var_dump() |
| 類型 | 語言結構 | 函數 | 函數 |
| 回傳值 | 無 | true (或字串當 $return=true) | 無 |
| 可用於表達式 | 否 | 是 | 否 |
| 支援多參數 | 是 echo $a, $b | 否 (單一參數) | 否 |
| 輸出內容 | 字串/數值 | 結構化陣列/物件 (可讀) | 完整型別、長度、值 (除錯級) |
| 處理物件 | 報錯 Catchable fatal error | 顯示屬性 | 顯示屬性、類別名、ID |
| 處理資源 | 顯示 Resource id | 顯示 Resource id | 顯示類型、ID |
| 遞迴保護 | 無 | 有 *RECURSION* | 有 *RECURSION* |
詳細行為分析
1. echo — 最高效的字串輸出
echo 'Hello', ' ', 'World'; // 多參數,無逗號效能略優於連接
echo $var; // 字串、數值、__toString() 物件
// echo $arr; // 錯誤:Array to string conversion
// echo $obj; // 錯誤:Object of class X could not be converted to string
- 無回傳值,不可寫在
($x = echo 'a') 等表達式中
- 語言結構,非函數,無函數呼叫開銷,效能最佳
- 輸出緩衝 (
ob_start()) 可捕獲其輸出
2. print_r() — 開發時檢視陣列/物件結構
$arr = ['a' => 1, 'b' => [2, 3]];
print_r($arr);
/* 輸出:
Array
(
[a] => 1
[b] => Array
(
[0] => 2
[1] => 3
)
)
*/
// 回傳字串而非輸出
$str = print_r($arr, true);
- 第二參數
true 時回傳格式化字串,預設 false 直接輸出並回傳 true
- 不顯示型別資訊 (如
int, string)、長度、私有屬性
- 物件僅顯示公有屬性
3. var_dump() — 完整除錯資訊
$arr = ['x' => 'hello'];
var_dump($arr);
/* 輸出:
array(1) {
["x"]=>
string(5) "hello"
}
*/
var_dump(123, 1.5, true, null, 'str', $arr, new StdClass);
- 顯示型別、長度/大小、值
- 支援多參數一次輸出
- 物件顯示類別名、所有屬性(含 private/protected)、物件 ID
- 資源顯示類型 (如
resource(3) of type (stream))
- 無回傳值
進階替代方案
var_export() — 可執行的 PHP 程式碼表示
$code = var_export($arr, true); // 回傳 "array ( 'x' => 'hello', )"
eval('$arr2 = ' . $code . ';'); // 可還原
debug_zval_dump() — 參考計數除錯
$a = [1,2]; $b = &$a;
debug_zval_dump($a); // 顯示 refcount(3) 等內部資訊
Symfony VarDumper / Laravel dump() — 現代化除錯
dump($arr); // 美化、可摺疊、顯示檔案/行號、支援 HTML/終端機
// 需安裝 symfony/var-dumper
選用建議
| 場景 | 推薦 | 理由 |
| 頁面輸出 HTML/文字 | echo | 效能最佳、語法簡潔 |
| 快速檢視陣列結構 | print_r($arr) | 輸出緊湊、易讀 |
| 需攜帶結構字串處理 | print_r($arr, true) | 可存入日誌、回傳 API |
| 深度除錯:型別、長度、私有屬性 | var_dump() | 資訊最完整 |
| 生產環境日誌記錄 | var_export() 或 JSON | 可還原、機器可讀 |
| 現代專案開發環境 | dump() (VarDumper) | 體驗最佳、功能最豐富 |
常見錯誤與避坑
echo $obj 未實作 __toString() → Catchable fatal error。解決:實作 __toString() 或改用 var_dump($obj)。
print_r($obj, true) 回傳字串但忘記 echo 或寫入日誌 → 無輸出。
- 大量資料
var_dump() 導致記憶體耗盡/輸出過大。解決:限制深度、使用 debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) 或分頁輸出。
- 生產環境殘留
var_dump() → 資訊洩露、輸出破壞 JSON API 格式。解決:部署流程掃描禁用、使用條件編譯 if (APP_DEBUG) var_dump(...)。
總結
echo 給使用者看;print_r 給開發者看結構;var_dump 給開發者看細節。現代專案請直接引入 symfony/var-dumper 享受 dump() 的最佳體驗,並建立「開發環境用 dump、生產環境用結構化日誌」的規範。