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

PHP 除錯利器:dump() 函式讓變數檢查如虎添翼

     編輯:PHP 相關知識

開發過程中頻繁需要檢查變數結構,一個功能完善的 dump() 函式能大幅提升除錯效率。支援輸出格式化、標籤標識、嚴格模式、HTML 安全輸出。

功能特性

  • 支援 var_dump (嚴格模式) 與 print_r (寬鬆模式) 雙引擎
  • 自動偵測 Xdebug 避免重複美化
  • HTML 環境自動包裝 <pre> 並轉義
  • CLI 環境輸出純文字
  • 可選擇直接輸出或返回字串
  • 自訂標籤前綴,多處 dump 易識別

完整實現代碼

<?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]");
    }
}

輸出效果對比

嚴格模式 (var_dump)

用戶資料 
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"
  }
}

寬鬆模式 (print_r)

用戶結構 : Array
(
    [id] => 123
    [name] => 張三
    [roles] => Array
        (
            [0] => admin
            [1] => editor
        )
    [meta] => stdClass Object
        (
            [last_login] => 2024-01-15
            [ip] => 192.168.1.1
        )
)

進階整合:Laravel 風格助手函式

<?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')返回字串,可記錄日誌
生產環境關閉或寫入檔案避免洩露敏感資訊
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved