Menu

var_dump() và print_r() trong PHP: in mảng và gỡ lỗi

print_r($array) in một mảng ở dạng dễ đọc, var_dump($value) hiển thị thêm kiểu và độ dài của mọi giá trị, còn var_export in ra code PHP hợp lệ. Tìm hiểu khi nào dùng hàm nào, cách lấy kết quả print_r dưới dạng chuỗi, và cách in đẹp trong HTML với <pre>.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

print_r($array) in một mảng hoặc đối tượng cùng các khóa và giá trị của nó ở dạng dễ đọc. var_dump($value) in cùng cấu trúc đó, cộng thêm kiểu và độ dài của mọi giá trị. Dùng print_r để xem trong mảng có gì, và var_dump khi bạn cần biết một giá trị là "1" hay 1.

So sánh hai kết quả ở dòng admin: print_r không in gì sau mũi tên, còn var_dump in ra bool(false). Khác biệt đó là lý do chính để dùng var_dump khi gỡ lỗi.

print_r, var_dump và var_export

Ba hàm hiển thị cùng một dữ liệu với mức chi tiết khác nhau:

print_rvar_dumpvar_export
Hiển thị kiểukhôngcódưới dạng literal PHP
false, null, ""không in gìbool(false), NULL, string(0) ""false, NULL, ''
Trả về được chuỗiprint_r($x, true)khôngvar_export($x, true)
Kết quả là code PHP hợp lệkhôngkhôngcó
Nhiều giá trị trong một lần gọikhôngvar_dump($a, $b)không

print_r dễ đọc nhất, var_dump chính xác nhất, còn var_export cho bạn code có thể dán ngược lại vào tệp.

Lấy kết quả print_r dưới dạng chuỗi

Truyền true làm đối số thứ hai, print_r sẽ trả về văn bản thay vì in ra. Đó là cách ghi một mảng vào tệp log hoặc đưa nó vào một thông báo dài hơn.

var_export($value, true) cũng trả về chuỗi theo cách tương tự. var_dump thì luôn in ra, nên muốn lấy kết quả của nó, bạn cần output buffering: ob_start(); var_dump($x); $text = ob_get_clean();.

In mảng đẹp trong HTML với pre

Trên trình duyệt, các dấu xuống dòng và khoảng trắng của print_r bị dồn thành một dòng dài, vì HTML bỏ qua khoảng trắng. Bọc kết quả trong <pre> để giữ nguyên bố cục. Chạy đoạn này và xem tab Trang.

htmlspecialchars trở nên quan trọng ngay khi dữ liệu có thể chứa < hoặc &, ví dụ dữ liệu người dùng nhập: thiếu nó, trình duyệt sẽ coi đoạn văn bản đó là HTML. Với dữ liệu gửi cho JavaScript hoặc API, dạng json_encode thường hữu ích nhất.

In nhiều giá trị cùng lúc

var_dump nhận bao nhiêu đối số cũng được và in lần lượt từng cái, rất tiện để so sánh hai giá trị cạnh nhau.

Kết quả cho thấy vì sao == nói chúng bằng nhau còn === thì không: một bên là string(2) "42", bên kia là int(42).

In đối tượng

Cả ba hàm đều in được đối tượng. var_dump và print_r đánh dấu các thuộc tính private và protected ([label:Point:private]), giúp ích khi một thuộc tính có vẻ bị thiếu.

#1 trong kết quả của var_dump là id của đối tượng. Hai biến hiển thị cùng một id thì trỏ tới cùng một đối tượng.

Lỗi thường gặp: echo một mảng

echo biến đối số của nó thành chuỗi. Mảng không có dạng chuỗi, nên PHP in ra chữ Array và đưa ra một cảnh báo:

<?php
$colors = ["red", "green", "blue"];
echo $colors;

PHP in ra:

Warning: Array to string conversion in /home/index.php on line 3
Array

Hãy in nội dung bằng một trong các hàm ở trên, hoặc tự nối các giá trị lại:

implode dùng để hiển thị danh sách cho người dùng, json_encode cho log và API, còn print_r hoặc var_dump để bạn tự gỡ lỗi.

Câu hỏi thường gặp

var_dump và print_r khác nhau thế nào?

print_r hiển thị khóa và giá trị ở dạng ngắn gọn, dễ đọc. var_dump hiển thị thêm kiểu và độ dài của từng giá trị, như string(3) "Ada" và bool(false), nên đây là hàm nên dùng khi kiểu dữ liệu quan trọng. print_r(false) không in ra gì cả, còn var_dump(false) in ra bool(false).

Làm sao để lấy kết quả của print_r dưới dạng chuỗi?

Truyền true làm đối số thứ hai: $text = print_r($array, true); trả về văn bản thay vì in ra, nên bạn có thể ghi nó vào log bằng error_log($text) hoặc gán vào một biến. var_export($value, true) hoạt động tương tự; var_dump không có tùy chọn này.

Làm sao để in mảng đẹp mắt trên trình duyệt?

Bọc kết quả trong thẻ <pre> để trình duyệt giữ nguyên ngắt dòng và thụt lề: echo '<pre>' . print_r($array, true) . '</pre>';. Hãy escape nó bằng htmlspecialchars nếu dữ liệu có thể chứa HTML.

Vì sao echo một mảng lại in ra Array?

echo chuyển đối số của nó thành chuỗi, và một mảng khi chuyển thành chuỗi sẽ thành chữ Array kèm cảnh báo "Array to string conversion". Hãy dùng print_r, var_dump, implode(', ', $arr) hoặc json_encode($arr) để in nội dung.

var_export trong PHP làm gì?

Hàm này in một giá trị ra dưới dạng code PHP hợp lệ, ví dụ array ( 0 => 'a', ), mà bạn có thể dán ngược lại vào script. Với true làm đối số thứ hai, nó trả về code dưới dạng chuỗi, đó là cách một số công cụ ghi tệp cấu hình được cache.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu