Nếu bạn quấn đầu ra của chức năng như print_r
, var_dump
và var_export
trong thẻ <pre>
, thẻ sẽ được định dạng tương đối độc đáo.
Lý do là do đầu ra của các hàm là văn bản thuần túy, nhưng khi bạn nhìn vào nó trong trình duyệt, trình duyệt sẽ xem nó là HTML. Các ký tự dòng mới trong đầu ra chữ thô không có ý nghĩa đối với HTML, vì các dòng mới bị bỏ qua.
Để xem tính năng này hoạt động, hãy thử xem nguồn - bạn sẽ thấy đầu ra được định dạng độc đáo ở đó.
pre
Thẻ HTML cho trình duyệt biết "mọi thứ bên trong khối này là pre -formated". Các dòng mới được coi là dòng mới, khoảng cách được tôn trọng (HTML cũng không quan tâm đến chuỗi các khoảng trống).
Vì vậy, bạn đang trái với một cái gì đó như thế này:
echo '<pre>'.print_r($my_array).'</pre>';
Thay vì làm điều đó khắp nơi trên mã của tôi, tôi muốn sử dụng một chức năng tổng hợp như thế này (tôi gọi nó print_p
nên rất như gõ print_r
)
function print_p($value = false, $exit = false, $return=false, $recurse=false) {
if ($return === true && $exit === true)
$return = false;
$tab = str_repeat(" ", 8);
if ($recurse == false) {
$recurse = 0;
$output = '<div style="width:100%; border: 2px dotted red; background-color: #fbffd6; display: block; padding: 4px;">';
$backtrace = debug_backtrace();
$output .= '<b>Line: </b>'.$backtrace[0]['line'].'<br>';
$output .= '<b>File: </b> '.$backtrace[0]['file'].'<br>';
$indent = "";
} else {
$output = '';
$indent = str_repeat(" ", $recurse * 8);
}
if (is_array($value)) {
if ($recurse == false) {
$output .= '<b>Type: </b> Array<br>';
$output .= "<br>array (<br>";
} else {
$output .= "array (<br>";
}
$items = array();
foreach ($value as $k=>$v) {
if (is_object($v) || is_array($v))
$items[] = $indent.$tab."'".$k."'=>".print_p($v, false, true, ($recurse+1));
else
$items[] = $indent.$tab."'".$k."'=>".($v===null ? "NULL" : "'".$v."'");
}
$output .= implode(',<br>', $items);
if ($recurse == false)
$output .= '<br>)';
else
$output .= '<br>'.$indent.')';
} elseif (is_object($value)) {
if ($recurse == false) {
$output .= '<b>Type: </b> Object<br>';
$output .= '<br>object ('.get_class($value).'){'."<br>";
} else {
$output .= "object (".get_class($value)."){<br>";
}
// needed conditional because base class function dump is protected
$vars = get_object_vars($value);
$vars = (is_array($vars) == true ? $vars : array());
$items = array();
foreach ($vars as $k=>$v) {
if (is_object($v) || is_array($v))
$items[] = $indent.$tab."'".$k."'=>".print_p($v, false, true, ($recurse+1));
else
$items[] = $indent.$tab."'".$k."'=>".($v===null ? "NULL" : "'".$v."'");
}
$output .= implode(',<br>', $items);
$vars = get_class_methods($value);
$items = array();
foreach ($vars as $v) {
$items[] = $indent.$tab.$tab.$v;
}
$output .= '<br>'.$indent.$tab.'<b>Methods</b><br>'.implode(',<br>', $items);
if ($recurse == false)
$output .= '<br>}';
else
$output .= '<br>'.$indent.'}';
} else {
if ($recurse == false) {
$output .= '<b>Type: </b> '.gettype($value).'<br>';
$output .= '<b>Value: </b> '.$value;
} else {
$output .= '('.gettype($value).') '.$value;
}
}
if ($recurse == false)
$output .= '</div>';
if ($return === false)
echo $output;
if ($exit === true)
die();
return $output;
}
... thì bạn làm như sau:
print_p($my_array);
... và nhận được kết quả:
này là tốt đẹp vì nó a) sẽ mất bất kỳ loại biến, đối tượng, mảng, chuỗi, và b) cho bạn biết nơi sản lượng đang đến từ. Nó có thể nhận được thực sự bực bội nếu bạn mất theo dõi nơi bạn đã đặt một thông báo gỡ lỗi và phải dành nhiều thời gian tìm kiếm trên tất cả cho nó! :)
bạn có ý nghĩa như: 'echo '
';' –yeah, chắc chắn ông có nghĩa là như thế :) – Alfabravo