首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 輸出函數大比拚:echo、print_r、var_dump 差異與選用指南

     編輯:PHP 綜合知識

核心差異一覽

特性echoprint_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)體驗最佳、功能最豐富

常見錯誤與避坑

  1. echo $obj 未實作 __toString() → Catchable fatal error。解決:實作 __toString() 或改用 var_dump($obj)。
  2. print_r($obj, true) 回傳字串但忘記 echo 或寫入日誌 → 無輸出。
  3. 大量資料 var_dump() 導致記憶體耗盡/輸出過大。解決:限制深度、使用 debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) 或分頁輸出。
  4. 生產環境殘留 var_dump() → 資訊洩露、輸出破壞 JSON API 格式。解決:部署流程掃描禁用、使用條件編譯 if (APP_DEBUG) var_dump(...)。

總結

echo 給使用者看;print_r 給開發者看結構;var_dump 給開發者看細節。現代專案請直接引入 symfony/var-dumper 享受 dump() 的最佳體驗,並建立「開發環境用 dump、生產環境用結構化日誌」的規範。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved