開發過程中頻繁需要檢查變數結構,一個功能完善的 dump() 函式能大幅提升除錯效率。支援輸出格式化、標籤標識、嚴格模式、HTML 安全輸出。
var_dump (嚴格模式) 與 print_r (寬鬆模式) 雙引擎<pre> 並轉義<?php
/**
* 變數除錯輸出
* @param mixed $var 要檢查的變數
* @param bool $echo true=直接輸出, false=返回字串
* @param string|null $label 自訂標籤前綴
* @param bool $strict true=var_dump(含型別), false=print_r(僅值)
* @return string|null
*/
function dump($var, $echo = true, $label = null, $strict = true) {
$label = ($label === null) ? '' : rtrim($label) . ' ';
if (!$strict) {
// 寬鬆模式:print_r
if (ini_get('html_errors')) {
$output = print_r($var, true);
$output = "<pre>{$label}" . htmlspecialchars($output, ENT_QUOTES) . "</pre>";
} else {
$output = $label . " : " . print_r($var, true);
}
} else {
// 嚴格模式:var_dump
ob_start();
var_dump($var);
$output = ob_get_clean();
// Xdebug 已美化時不需額外處理
if (!extension_loaded('xdebug')) {
// 統一縮進格式
$output = preg_replace('/\]\=\>\n(\s+)/m', '] => ', $output);
$output = '<pre>' . $label . htmlspecialchars($output, ENT_QUOTES) . '</pre>';
}
}
if ($echo) {
echo $output;
return null;
}
return $output;
}
// 別名函式 (習慣用法)
function dd($var, $label = null) {
dump($var, true, $label, true);
die; // 輸出後終止執行
}
function ddp($var, $label = null) {
dump($var, true, $label, false); // print_r 模式
die;
}
<?php
$user = [
'id' => 123,
'name' => '張三',
'roles' => ['admin', 'editor'],
'meta' => (object)['last_login' => '2024-01-15', 'ip' => '192.168.1.1'],
];
// 1. 基本用法 (var_dump 模式,含型別資訊)
dump($user, true, '用戶資料');
// 2. 僅查看結構值 (print_r 模式)
dump($user, true, '用戶結構', false);
// 3. 獲取字串不輸出 (寫入日誌/API 回傳)
$logStr = dump($user, false, '記錄', true);
file_put_contents('debug.log', $logStr . "\n", FILE_APPEND);
// 4. dd() 除錯中斷:檢查後立即停止
$response = apiCall();
dd($response, 'API 回應'); // 這行後不再執行
// 5. 迴圈中檢查特定條件
foreach ($items as $i => $item) {
if ($item['status'] === 'error') {
dump($item, true, "錯誤項目 [$i]");
}
}
用戶資料
array(4) {
["id"]=>
int(123)
["name"]=>
string(6) "張三"
["roles"]=>
array(2) {
[0]=>
string(5) "admin"
[1]=>
string(6) "editor"
}
["meta"]=>
object(stdClass)#1 (2) {
["last_login"]=>
string(10) "2024-01-15"
["ip"]=>
string(13) "192.168.1.1"
}
}
用戶結構 : Array
(
[id] => 123
[name] => 張三
[roles] => Array
(
[0] => admin
[1] => editor
)
[meta] => stdClass Object
(
[last_login] => 2024-01-15
[ip] => 192.168.1.1
)
)
<?php
if (!function_exists('dump')) {
function dump(...$args) {
foreach ($args as $arg) {
\Symfony\Component\VarDumper\VarDumper::dump($arg);
}
}
}
if (!function_exists('dd')) {
function dd(...$args) {
foreach ($args as $arg) {
\Symfony\Component\VarDumper\VarDumper::dump($arg);
}
die(1);
}
}
現代框架 (Laravel, Symfony) 內建基於 symfony/var-dumper 的強化版,支援摺疊、搜尋、複製路徑等互動功能。
| 場景 | 推薦函式 | 說明 |
|---|---|---|
| 快速檢查變數 | dump($var) | 預設嚴格模式,含型別 |
| 檢查陣列結構 | dump($var, true, '標籤', false) | print_r 模式較清晰 |
| 中斷點除錯 | dd($var, '標籤') | 輸出後 die,阻斷後續 |
| API 回傳除錯 | dump($var, false, 'API') | 返回字串,可記錄日誌 |
| 生產環境 | 關閉或寫入檔案 | 避免洩露敏感資訊 |