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