Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

จับผลลัพธ์ var_dump ไปเก็บใน String (Output Buffering)

var_dump() พิมพ์ Output โดยตรง ไม่คืนค่า String ใช้ Output Buffering เพื่อจับ Output ไปใส่ใน Variable

ฟังก์ชันมาตรฐาน

/**
 * จับ Output ของ var_dump ไปเก็บใน String
 * 
 * @param mixed $var
 * @return string
 */
function varDumpToString($var): string {
    ob_start();
    var_dump($var);
    return ob_get_clean();
}

// ใช้งาน
$data = ['first', 'second', 'third'];
$result = varDumpToString($data);
echo $result;
/* Output:
array(3) {
  [0]=>
  string(5) "first"
  [1]=>
  string(6) "second"
  [2]=>
  string(5) "third"
}
*/

ฟังก์ชันขยาย: รองรับหลาย Variable + Label

function dump(...$vars): string {
    ob_start();
    foreach ($vars as $i => $var) {
        if ($i > 0) echo "\n";
        // Optional: Label
        if (is_string($var) && count($vars) === 1) {
            // Single string argument -> treat as label for next? No, keep simple.
        }
        var_dump($var);
    }
    return ob_get_clean();
}

// ใช้งาน
echo dump($user, $posts, $settings);

กรณีใช้งานจริง

1. Logging/Debug ไฟล์

function debugLog($label, $data) {
    $log = date('Y-m-d H:i:s') . " [$label]\n" . varDumpToString($data) . "\n---\n";
    file_put_contents('debug.log', $log, FILE_APPEND | LOCK_EX);
}

debugLog('USER_LOGIN', $_SESSION['user'] ?? null);

2. API Debug Response

// Development only
if ($_ENV['APP_DEBUG'] ?? false) {
    $debugData = [
        'query' => $sql,
        'params' => $params,
        'result' => $result,
    ];
    error_log(varDumpToString($debugData));
}

3. Unit Test Assertion

// ใน PHPUnit Test
$expected = ['a' => 1, 'b' => 2];
$actual = $service->getData();

$this->assertEquals(
    varDumpToString($expected),
    varDumpToString($actual)
);

Output Buffering Functions

Functionคำอธิบาย
ob_start()เปิด Output Buffering
ob_get_contents()ดึงเนื้อหาใน Buffer (ยังไม่ปิด)
ob_get_clean()ดึงเนื้อหา และ ปิด Buffer (ล้าง Buffer)
ob_end_clean()ปิด Buffer และทิ้งเนื้อหา
ob_end_flush()ปิด Buffer และส่ง Output ไป Browser
ob_get_level()ตรวจสอบระดับ Nesting ของ Buffer

⚠️ ข้อควรระวัง

  • Nested ob_start() ได้ (ต้อง ob_end_*() คู่กัน)
  • var_dump() ไม่ Return ค่า - ต้องใช้ Output Buffering เท่านั้น
  • Alternative: var_export($var, true) คืนค่า String โดยตรง (แต่ Format ต่างจาก var_dump)
$str = var_export($data, true); // คืนค่า String ทันที, ไม่ต้อง Output Buffering
// Format: array ( 0 => 'first', 1 => 'second', ) - Compact กว่า var_dump