ทางเลือก Var_dump ที่สวยกว่า / ให้ข้อมูลใน PHP? [ปิด]


130

ทุกโปรแกรม PHP ดีมีprint_rหรือvar_dumpเสื้อคลุมที่พวกเขาใช้ความรักและปุ่มลัดมอบหมายให้ทำไมเราไม่แบ่งปันคนที่ชื่นชอบของเรา


39
ฉันใช้ echo '<pre>'; print_r ($ var); exit; ฉันไม่ได้ปิดมัน ฉันเดาว่าฉันไม่ดี
Funky Dude

ฉันแก้ไขลิงก์เพื่อชี้ไปที่ github ซึ่งฉันดำเนินการพัฒนา Kint ต่อไปและหากคุณยังมีปัญหาใด ๆ โปรดแจ้งให้เราทราบด้วยวิธีใดก็ได้
คลั่งไคล้

1
เฮ้คินท์เจ๋ง! มันช่วยวันของฉัน
István Ujj-Mészáros

2
เหตุใดคำถามที่ 100% การแจ้งโฆษณาของโปรแกรมจึงเข้าสู่เวอร์ชัน "ฉันสร้าง var_dump () ของฉันเอง" ?? คำถามแรกคือเหตุใดจึงอนุญาตให้มีการโฆษณาผลิตภัณฑ์เป็นคำถาม
m3nda

11
เพราะฉันทำเครื่องมือมากกว่าหนึ่งปีต่อมาหลังจากที่ถามคำถาม ฉันไม่รู้ว่ามีอะไรรบกวนคุณฉันได้สร้างเครื่องมือโอเพ่นซอร์สสำหรับผู้ใหญ่ 10k + line และกำลังปรับปรุงอย่างต่อเนื่องในอีกหลายปีต่อมา ฉันให้คำตอบของตัวเองในคำถาม - ตามประเพณีใน SO
คลั่ง

คำตอบ:


71

หนึ่งปีเต็มของเวลาและแรงงานหลังจากถามสิ่งนี้ในที่สุดฉันก็เปิดที่มาของ var_dump รุ่น Kint ของฉัน อ่านเกี่ยวกับมันในหน้าโครงการหรือโดยตรงใน GitHub

นี่คือภาพหน้าจอ:

Kint

ขออภัยสำหรับปลั๊ก :)


แก้ไข:ฉันต้องการเพียงแค่ต้องการที่จะเตือนผู้แสดงความคิดเห็นว่านี้ไม่ได้เป็นฟอรั่มการสนับสนุนถ้าคุณกำลังมีปัญหา / ต้องการคุณลักษณะโปรดยื่นปัญหา การสนับสนุนที่ร้องขอความคิดเห็นจะถูกตั้งค่าสถานะเพื่อลบ


ฉันต้องเปลี่ยนขนาดตัวอักษรและทำให้โค้ด CSS สวยงาม แต่ทำได้ดีฉันชอบ ... มาจากผู้ใช้ Krumo เป็นเวลานาน
Quamis

1
คุณทำการเปลี่ยนแปลงอะไรบ้างถ้าคุณเชื่อว่าเป็นการปรับปรุงคุณสามารถส่งการเปลี่ยนแปลงมาที่ raveren@gmail.com
raveren

ฉันคุ้นเคยกับ Krumo และฉันต้องการฟอนต์ที่เล็กลงและฉันก็ตกแต่งโค้ด CSS ให้สวยงามด้วย ไม่มีอะไรที่สามารถเรียกได้ว่าเป็นการปรับปรุงที่แท้จริงเหมือนนิสัยเดิม ๆ :)
Quamis

แนวคิดก็คือ css ควรจะถูกบีบอัดพร้อมกับ js เพื่อที่จะรบกวนเอาต์พุตจริงให้น้อยที่สุด แน่นอนว่ามีการวางแผนการเยื้องแหล่งที่มาที่สร้างขึ้นด้วยเช่นกัน แต่ตอนนี้ฉันไม่มีเวลาทุ่มเทให้กับ Kint ..
คลั่ง

2
เช่นเดียวกับตัวอย่าง Kint จะแสดงตัวแปรที่มีการป้องกันและไพรเวตหากคุณถ่ายโอนอ็อบเจ็กต์ krumo จะไม่ทำ (เนื่องจากมีเพียงคลาสก่อนหน้าเท่านั้นที่ใช้คลาสการสะท้อนที่ฉันถือว่า) โดยทั่วไปแล้วฉันพบว่า Kint เหนือกว่า แม้ว่าฉันจะต้องปรับแต่ง css เพื่อให้ใช้งานได้มากขึ้น (แบบอักษรขนาดใหญ่นั้นทำงานได้ไม่ดีนักเมื่อทิ้ง propierties ที่ซ้อนกันจำนวนมาก) โอ้และรหัสที่อยู่เบื้องหลังมันไม่ได้เป็นระเบียบบางสิ่งบางอย่างที่ไม่สามารถกล่าวว่าจาก Krumo (ขออภัยผู้เขียน Krumo!)
Mahn

45

สิ่งที่ฉันชอบคือvar_dumpฟังก์ชั่นตามที่ระบุโดยส่วนขยาย Xdebug : เพียงแค่ติดตั้งส่วนขยาย(ง่ายทั้งบน windows และ Linux)และvar_dumpรับผลลัพธ์ที่ดีกว่า:

  • การจัดรูปแบบที่ดีขึ้น
    • HTML
    • สี
  • และคุณมีตัวเลือกในการปรับแต่งว่าควรแสดงข้อมูลมากน้อยเพียงใด

และภาพหน้าจอสั้น ๆ :

xdebug


และแน่นอน Xdebug นำเสนอสิ่งที่เป็นประโยชน์อื่น ๆ มากมายเช่นการดีบักระยะไกล(เช่นการดีบักแบบกราฟิกของแอปพลิเคชัน PHP ของคุณใน Eclipse PDT เป็นต้น) การทำโปรไฟล์ ...


1
ฉันต้องใช้คลาสการจัดรูปแบบ xdebug นี้ในโฮสต์ที่ใช้ร่วมกัน มีวิธีใดบ้างที่จะรวมไว้ในโครงการส่วนตัวของฉัน
Anyul Rivas

1
ถ้าคุณไม่ได้ผู้ดูแลระบบ (root) ของเซิร์ฟเวอร์ของคุณคุณมักจะไม่สามารถติดตั้งส่วนขยาย PHP (ผมไม่เคยเห็นผู้ให้บริการโฮสติ้งที่ใช้ร่วมกันที่จะติดตั้งหนึ่งในการติดตั้งส่วนขยาย PHP) ; ดังนั้นไม่ว่าคุณจะไม่สามารถที่จะใช้ Xdebug (ต่อไปติดตั้งบนเซิร์ฟเวอร์การผลิตโดยทั่วไปไม่ได้เป็นความคิดที่ดี: มันเป็นส่วนขยายของการแก้จุดบกพร่อง afterall) ; คุณจะต้องถอยกลับไปใช้ฟังก์ชันการส่งออกตัวแปรโดยใช้ PHP (ดูคำตอบอื่น ๆ )
Pascal MARTIN

1
ใช่ฉันแค่ต้องการให้คลาสส่งผลลัพธ์บางอย่างให้ตัวเองเมื่อเกิดข้อผิดพลาด
Anyul Rivas

34

ฉันเขียนของฉันเอง: REF ( สาธิต ):

r () เอาต์พุต

มีแผนจะเพิ่มการแสดงผลแบบข้อความเท่านั้นและแสดงข้อมูลเกี่ยวกับนิพจน์อินพุตเช่น Kint ทำ ...


4
งานดีเครื่องมือดีมาก
ssuperczynski

2
REF นั้นยอดเยี่ยมมีสีสันรวดเร็ว ฉันจะใช้มันตลอดเวลา.
Marty McGee

2
เครื่องมือที่ยอดเยี่ยมฉันเพิ่งเปลี่ยนมาใช้ ขอบคุณ!
Andris

คนไม่กี่คนใช้นักแต่งเพลงดี ... ไม่ใช่ฉัน ถ้าคุณจะสร้างdllฉันจะใช้ "debug" นี้ ขอบคุณและทำได้ดีมาก!
Alex

27

นี่เป็นของฉันซึ่งฉันใช้แบบอินไลน์มีประโยชน์มาก:

$pretty = function($v='',$c="&nbsp;&nbsp;&nbsp;&nbsp;",$in=-1,$k=null)use(&$pretty){$r='';if(in_array(gettype($v),array('object','array'))){$r.=($in!=-1?str_repeat($c,$in):'').(is_null($k)?'':"$k: ").'<br>';foreach($v as $sk=>$vl){$r.=$pretty($vl,$c,$in+1,$sk).'<br>';}}else{$r.=($in!=-1?str_repeat($c,$in):'').(is_null($k)?'':"$k: ").(is_null($v)?'&lt;NULL&gt;':"<strong>$v</strong>");}return$r;};

echo $pretty($some_variable);

2
ชอบฟังก์ชั่นนี้ - ง่ายและชัดเจนและฉันพูดถึงง่ายมาก :)
derekdreery

ขอบคุณ ฉันจะใช้มันตลอดเวลา. ควรสร้างไว้ใน PHP จริงๆ คุณสามารถจัดรูปแบบของคุณเองโดยใช้พารามิเตอร์ที่สอง เช่น echo $ pretty ($ some_variable, "-");
Guillermo Phillips

7
สิ่งนี้รวมคุณสมบัติที่แย่ที่สุดทั้งหมดจาก print_r, var_dump และ var_export ไว้อย่างสวยงาม ไม่มี html ที่หนีออกมายอมรับพารามิเตอร์เดียวเท่านั้นแฮงค์ในการเรียกซ้ำไม่สามารถกลับมาส่งออกและเพียงแค่ไปด้านบนออกก็ไม่สามารถอ่านได้โดยสิ้นเชิง ฉันไม่ต้องการเป็นคนโง่ แต่ความคิดเห็นก็ทำให้มันดูสมบูรณ์แบบมาก
คลั่ง

ขอบคุณสำหรับความคิดเห็นของคุณ @Raveren หากคุณสามารถเจาะจงได้มากกว่านี้ฉันจะปรับปรุงคำตอบของฉัน
Guillermo Phillips

2
IMO function pretty(){echo'<pre>';foreach(func_get_args()as $arg){ob_start();var_dump($arg);echo htmlentities(ob_get_clean())."\n#####\n#####\n\n";}die;}ทางออกเดียวที่ดีที่สุดก็คือ Var_dump เป็นฟังก์ชั่นที่ละเอียดมากมันจัดการกับ PHPs edge case ทั้งหมด (ซึ่งมี LOTS) และเสถียร 100% แม้ว่าจะอ่านไม่ได้ก็ตาม แต่ในตอนท้ายของวันหากคุณพบว่าการใช้งานของคุณดีที่สุดสำหรับคุณคุณควรนำไปใช้อย่างแน่นอน
raveren

16

คุณกำลังมองหาKrumo ( คำเตือนการแจ้งเตือนของ Chrome สำหรับมัลแวร์ )

พูดง่ายๆคือ Krumo เป็นตัวแทนที่ print_r () และ var_dump () ตามความหมาย Krumo เป็นเครื่องมือดีบัก (เริ่มต้นสำหรับ PHP4 / PHP5 ตอนนี้สำหรับ PHP5 เท่านั้น) ซึ่งแสดงข้อมูลที่มีโครงสร้างเกี่ยวกับตัวแปร PHP ใด ๆ


ยอดเยี่ยมมาก! ขอบคุณ +1
the_drow

2
พอลองแล้วมันพัง ฉันรายงานแล้ว แต่ไม่มีการตอบกลับและไม่มีเวอร์ชันใหม่
Mawg บอกว่าคืนสถานะ Monica

2
@Pekka ลิงก์กำลังส่งคำเตือนมัลแวร์ใน Chrome
Tim Post

วันนี้ krumo ได้รับการอัปเดตโดยผู้ชายคนนี้github.com/mmucklo/krumo (แต่ Kint อาจจะดีกว่ารายละเอียดเพิ่มเติม)
lolesque

9

ฉันรักFirePHPบวกวางเพลิง

  • เขียนข้อมูลการบันทึกโดยใช้ส่วนหัวดังนั้นจึงไม่ทำลาย AJAX
  • ให้การแสดงตัวแปร / วัตถุที่คุณบันทึกเป็นกราฟิกที่ดีมาก
  • สามารถแสดงชื่อไฟล์และหมายเลขบรรทัดที่คำสั่งบันทึกแต่ละรายการเกิดขึ้น
  • ใช้งานง่ายในโครงการของคุณไม่ว่าจะด้วย API ขั้นตอนหรือเชิงวัตถุ


8

โซลูชัน (บางส่วน) ของฉันสำหรับสิ่งนี้คือการเพิ่มฟังก์ชันเช่นนี้ (โดยใช้ Google Chrome):

<?
function console_dump($value)
{ 
?>
<script>
    console.log(<? echo json_encode($value); ?>);
</script>
<?
}
?>

กด Ctrl + Shift + J (เปิดคอนโซล) และคุณจะพบโครงสร้าง JSON มีประโยชน์มากยิ่งขึ้นสำหรับการพิมพ์คำตอบ JSON ของหลักสูตร


8

ตัวอย่างที่สมบูรณ์ของสิ่งที่ฉันใช้ ...

<pre>

<?php


//*********** Set up some sample data

$obj = new stdClass;
$obj->a=123;
$obj->pl=44;
$obj->l=array(31,32);

$options = array(
  'Orchestra'=>array(1=>'Strings', 8=>'Brass', 9=>$obj, 3=>'Woodwind', 16=>'Percussion'),
  2=>'Car',
  4=>'Bus',
  'TV'=>array(21=>'Only Fools', 215=>'Brass Eye', 23=>'Vic Bob',44=>null, 89=>false));


//*********** Define the function

function dump($data, $indent=0) {
  $retval = '';
  $prefix=\str_repeat(' |  ', $indent);
  if (\is_numeric($data)) $retval.= "Number: $data";
  elseif (\is_string($data)) $retval.= "String: '$data'";
  elseif (\is_null($data)) $retval.= "NULL";
  elseif ($data===true) $retval.= "TRUE";
  elseif ($data===false) $retval.= "FALSE";
  elseif (is_array($data)) {
    $retval.= "Array (".count($data).')';
    $indent++;
    foreach($data AS $key => $value) {
      $retval.= "\n$prefix [$key] = ";
      $retval.= dump($value, $indent);
    }
  }
  elseif (is_object($data)) {
    $retval.= "Object (".get_class($data).")";
    $indent++;
    foreach($data AS $key => $value) {
      $retval.= "\n$prefix $key -> ";
      $retval.= dump($value, $indent);
    }
  }
  return $retval;
}


//*********** Dump the data

echo dump($options);

?>
</pre>

เอาท์พุต ...

Array (4)
 [Orchestra] = Array (5)
 |   [1] = String: 'Strings'
 |   [8] = String: 'Brass'
 |   [9] = Object (stdClass)
 |   |   a -> Number: 123
 |   |   pl -> Number: 44
 |   |   l -> Array (2)
 |   |   |   [0] = Number: 31
 |   |   |   [1] = Number: 32
 |   [3] = String: 'Woodwind'
 |   [16] = String: 'Percussion'
 [2] = String: 'Car'
 [4] = String: 'Bus'
 [TV] = Array (5)
 |   [21] = String: 'Only Fools'
 |   [215] = String: 'Brass Eye'
 |   [23] = String: 'Vic Bob'
 |   [44] = NULL
 |   [89] = FALSE

1
ฉันเปลี่ยน \ n เป็น PHP_EOL และใช้งานได้ดีเมื่อใช้ php จาก CMD ของหน้าต่าง
iewebguy

7

นี่คือของฉัน:

class sbwDebug
{
    public static function varToHtml($var = '', $key = '')
    {
        $type = gettype($var);
        $result = '';

        if (in_array($type, ['object', 'array'])) {
            $result .= '
        <table class="debug-table">
            <tr>
            <td class="debug-key-cell"><b>' . $key . '</b><br/>Type: ' . $type . '<br/>Length: ' . count($var) . '</td>
            <td class="debug-value-cell">';

            foreach ($var as $akey => $val) {
                $result .= sbwDebug::varToHtml($val, $akey);
            }
            $result .= '</td></tr></table>';
        } else {
            $result .= '<div class="debug-item"><span class="debug-label">' . $key . ' (' . $type . '): </span><span class="debug-value">' . $var . '</span></div>';
        }

        return $result;
    }
}

จัดแต่งทรงด้วย:

table.debug-table {
  padding: 0;
  margin: 0;
  font-family: arial,tahoma,helvetica,sans-serif;
  font-size: 11px;
}

td.debug-key-cell {
  vertical-align: top;
  padding: 3px;
  border: 1px solid #AAAAAA;
}

td.debug-value-cell {
  vertical-align: top;
  padding: 3px;
  border: 1px solid #AAAAAA;
}

div.debug-item {
  border-bottom: 1px dotted #AAAAAA;
}

span.debug-label {
  font-weight: bold;
}

2
ไม่เลวจริง อาจจะได้รับการโหวตมากขึ้นหากคุณแสดงตัวอย่างของผลลัพธ์
Mawg กล่าวว่าคืนสถานะ Monica

@acSlater ทำงานให้ฉันคุณแค่ต้องสร้างsbwDebugคลาสที่เขาลืมโพสต์และใส่ฟังก์ชันลงไป
Dennis98

6

ฉันเพิ่งพัฒนาส่วนขยาย Chrome ฟรี (อยู่ระหว่างดำเนินการ) เพื่อทำให้การถ่ายโอนข้อมูลของฉันสวยงามโดยไม่มีไลบรารีไม่มีแท็กล่วงหน้าและไม่มีการติดตั้งในแต่ละแอป ทั้งหมดทำได้ด้วย JavaScript และ regEx สิ่งที่คุณต้องทำคือติดตั้งส่วนขยายและสิ่งที่คุณควรทำ ฉันกำลังทำงานกับ Firefox เวอร์ชันด้วย นี่คือหน้า GitHub ฉันหวังว่าจะมีให้ใช้งานบนเว็บสโตร์ของ Chrome และ Firefox เร็ว ๆ นี้!

https://github.com/alexnaspo/var_dumpling

นี่คือตัวอย่างผลลัพธ์:

ตัวอย่างผลลัพธ์


6
เพื่อนที่ดี! เพียงดาวน์โหลดส่วนขยายของคุณและทำงานได้อย่างสมบูรณ์! ขอบคุณ!
coryj

5
เพื่อน ... ขอบคุณ ฉันมองหาอะไรแบบนี้มาระยะหนึ่งแล้ว
Broadbent

1
ไม่จริง ตัวเลือกที่ดีที่สุด!
คริสเตียน

ลองกับ Firefox 15 มันบอกว่าเข้ากันไม่ได้ มีโอกาสที่จะข้ามสิ่งนี้หรือไม่?
cyberfly

1
สวยมากขอให้เจอเร็ว ๆ นะ!


2

ห้องสมุดแฟนซีเหล่านั้นยอดเยี่ยมมาก ... ยกเว้นค่าใช้จ่าย หากคุณต้องการ var_dump ที่เรียบง่ายและสวยงามที่รับพารามิเตอร์ไม่สิ้นสุดลองใช้ฟังก์ชันของฉัน มันเพิ่ม HTML ง่ายๆ มีการเพิ่มแอตทริบิวต์ข้อมูลด้วยเช่นกันหากคุณใช้ HTML5 เวอร์ชันที่ต่ำกว่าจะเพิกเฉย แต่ทำให้ง่ายต่อการเปิดองค์ประกอบในคอนโซลเบราว์เซอร์และรับข้อมูลเพิ่มเติมเล็กน้อยหากสิ่งที่คุณเห็นบนหน้าจอไม่เพียงพอ

เค้าโครงง่ายมากไม่มีค่าใช้จ่าย ให้ข้อมูลมากมายสำหรับแต่ละพารามิเตอร์รวมถึงสิ่งต่างๆเช่นgettypeและแม้แต่classชื่อของ Object dumps (รวมถึง XML) มันพยายามและจริงฉันใช้มันมาหลายปีแล้ว

function preDump() {    //  use string "noEcho" to just get a string return only
    $args = func_get_args();
    $doEcho = TRUE; $sb;
    if ($args) {
        $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;padding:0em 3em 1em 1em;"><legend><b>preDump: '.count($args).' Parameters Found.</b></legend>';
        foreach (func_get_args() as $arg) {
            if (gettype($arg) == 'string') if ($arg == 'noEcho') { $doEcho = FALSE; $sb = preg_replace('/(preDump: )[0-9]+/', 'preDump: '.(count($args)-1), $sb); continue; }
            $sb .= '<pre data-type="'.gettype($arg).'"';
            switch (gettype($arg)) {
                case "boolean":
                case "integer":
                    $sb .= ' data-dump="json_encode"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>';
                    $sb .= json_encode($arg);
                    break;
                case "string":
                    $sb .= ' data-dump="echo"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>';
                    $sb .= $arg;
                    break;
                default:
                    $sb .= ' data-dump="var_dump"';
                    if (is_object($arg)) $sb .= 'data-class="'.get_class($arg).'"';
                    $sb .= '><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')';
                    if (is_object($arg)) $sb .= ' ['.get_class($arg).']';
                    $sb .= '</b></p><p>';
                    ob_start();
                    var_dump($arg);
                    $sb .= ob_get_clean();
                    if (ob_get_length()) ob_end_clean();
            }
            $sb .= '</p></pre>';
        }
        $sb .= '</fieldset></div>';
    }
    else {
        $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;"><legend><b>preDump: [ERROR]</b></legend><h3>No Parameters Found</h3></fieldset></div>';
    }
    if ($doEcho) echo($sb);
    return $sb;
}

และหากคุณใช้ Codeigniter ให้เพิ่ม CI EXTREMELY SIMPLY ของคุณด้วย ขั้นแรกไปที่application/config/autoload.phpและตรวจสอบว่าเปิดhelper 'string'อยู่

$autoload['helper'] = array( 'string' ); 

จากนั้นไปสร้างไฟล์ที่มีชื่อMY_string_helper.phpในapplication/helpersและใส่ฟังก์ชันในifคำสั่งทั่วไปสำหรับการตรวจสอบการมีอยู่

<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
    if (!function_exists('preDump')) {
        function preDump() {
            ...
        }
    }
//  DON'T CLOSE PHP

| หรือ | หากคุณต้องการเปลี่ยนทิศทาง

ตัวอย่างข้อมูลต่อไปนี้เหมือนกับด้านบนยกเว้นจะแสดงตัวแปรของคุณในคอนโซลเบราว์เซอร์ บางครั้งสิ่งนี้สามารถทำให้ง่ายต่อการดีบักการเรียกอ็อบเจ็กต์ sql และอาร์เรย์และการเรียกอ็อบเจ็กต์อื่น ๆ โดยที่คุณไม่มีชื่อคีย์หรืออะไรก็ตาม

function consoleDump() {    //  use string "noEcho" to just get a string return only
    $args = func_get_args();
    $doEcho = TRUE; $sb;
    if ($args) {
        $sb = '<script type="text/javascript">console.log("<" + new Array('.(count($args) < 10 ? '49': '48').').join("-") + "[consoleDump: '.count($args).' items]" + new Array(50).join("-") + ">"); console.log([';

        foreach (func_get_args() as $i => $arg) {
            if (gettype($arg) == 'string') if ($arg == 'noEcho') { $doEcho = FALSE; $sb = preg_replace('/(consoleDump: )[0-9]+/', 'consoleDump: '.(count($args)-1), $sb); continue; }
            $sb .= '{ "type": "'.gettype($arg).'", ';
            switch (gettype($arg)) {
                case "boolean":
                case "integer":
                case "string":
                    $sb .= '"value": '.json_encode($arg);
                    break;
                default:
                    $sb .= '"value": '.json_encode($arg);
                    if (is_object($arg) || is_array($arg)) $sb .= ', "count": '.json_encode(count((array)$arg));
                    if (is_object($arg)) $sb .= ', "objectClass": "'.get_class($arg).'"';
            }
            $sb .= '}';
            if ($i < count($args)-1) $sb .= ', ';
        }
        $sb .= ']); console.log("<" + new Array(120).join("-") + ">"); </script>';
    }
    else {
        $sb = '<script type="text/javascript">console.log("<" + new Array(120).join("-") + ">");console.log("consoleDump: [ERROR] No Parameters Found");console.log("<" + new Array(120).join("-") + ">");</script>';
    }
    if ($doEcho) echo($sb);
    return $sb;
}

ใช้ได้กับทุกสิ่ง!

consoleDump($simpXMLvar, $_SESSION, TRUE, NULL, array( 'one' => 'bob', 'two' => 'bill' ), (object)array( 'one' => 'bob', 'two' => 'bill' ));


<------------------------------------------------[consoleDump: 6 items]------------------------------------------------->
[Object, Object, Object, Object, Object, Object] 
// This drops down to show your variables in JS objects, like:
    0: Object
        count: 4
        objectClass: "SimpleXMLElement"
        type: "object"
        value: Object
        __proto__: Object
        // ...etc...
<-----------------------------------------------------------------------------------------------------------------------> 

1
เหตุใดจึงควรกังวลเกี่ยวกับประสิทธิภาพที่ลดลงเล็กน้อยในเครื่องมือพัฒนา ฟังก์ชันนี้echo '<pre>';var_dump($var);echo '</pre>';บวกกับข้อความที่มีค่าเป็นศูนย์
raveren

@ Raveren ใช่ยกเว้นpreDump('value', TRUE, array( 'bob => 'bill' ), (object)array( 'bob => 'bill' )' is quick and easy and gives a nice layout visually in the browser that shows each variable passed in it's own "area" with a type label, thus making debugging quick and easy. And since it's a snippet i keep in my IDE's toolbox, i can recall it with ease on any needed page or while working with any library. But sure, it's just an echo 'pre'; var_dump` กับข้อความบางส่วนsimple htmlไม่ใช่ 0-value-added text ฮ่า ๆ กิ๊ก. ถ้าไม่ชอบก็อย่าใช้ เพียงข้อเสนอแนะ
SpYk3HH

@Raveren และถ้าคุณชอบ ... คุณจะรักการอัปเดตของฉันจริงๆ: P
SpYk3HH

1

PHP Array Beautifier เครื่องมือง่ายๆนี้ใช้อาร์เรย์หรืออ็อบเจ็กต์เอาต์พุตใน PHP เช่นคำสั่ง print_r () และจัดรูปแบบเป็นโค้ดสีเพื่อให้อ่านข้อมูลของคุณได้ง่าย http://phillihp.com/toolz/php-array-beautifier/


ใช้ไม่ได้กับเอาต์พุต var_dump, แบ่งคำพูด, ดูสับสนอย่างยิ่งสำหรับการทิ้งที่ใหญ่กว่า
คลั่งไคล้

1

อีกรุ่นที่ปลูกเองที่บ้าน:

http://github.com/perchten/neat_html

ฉันชอบคิดว่ามันค่อนข้างยืดหยุ่น ไม่ได้มุ่งเป้าไปที่สภาพแวดล้อมเอาต์พุตเฉพาะ แต่มีอาร์กิวเมนต์ที่เป็นทางเลือกมากมายที่คุณสามารถระบุได้ว่าเหตุใดจึงเปลี่ยนผลลัพธ์ / การพิมพ์หรือลักษณะการทำงานรวมถึงการตั้งค่าถาวรบางอย่าง




1

หากคุณกำลังจัดการกับอาร์เรย์ขนาดใหญ่ใน PHP ฟังก์ชันนี้อาจช่วยได้:

function recursive_print ($varname, $varval) {
  if (! is_array($varval)):
    print $varname . ' = ' . var_export($varval, true) . ";<br>\n";
  else:
    print $varname . " = array();<br>\n";
    foreach ($varval as $key => $val):
      recursive_print ($varname . "[" . var_export($key, true) . "]", $val);
    endforeach;
  endif;
}

โดยทั่วไปจะทิ้งอาร์เรย์ทั้งหมดโดยที่แต่ละองค์ประกอบอยู่ในบรรทัดแยกกันซึ่งเป็นประโยชน์ในการค้นหาเส้นทางเต็มที่เหมาะสมสำหรับองค์ประกอบบางอย่าง

ตัวอย่างผลลัพธ์:

$a = array();
$a[0] = 1;
$a[1] = 2;
$a[2] = array();
$a[2][0] = 'a';
$a[2][1] = 'b';
$a[2][2] = 'c';

ดู: วิธีส่งออกอาร์เรย์ PHP โดยที่คู่คีย์ - ค่าแต่ละคู่อยู่ในบรรทัดแยกกัน


1

ฉันแปลกใจที่ไม่มีใครพูดถึงรหัสที่ง่ายที่สุด (แม้ว่าจะไม่ค่อยสวย) หากคุณต้องการให้ได้ผลลัพธ์ที่อ่านได้ (ไม่มีสีหรือการเยื้อง) ให้ใช้งานง่าย<pre>var_dumpเช่น:

echo "<pre>";
var_dump($myvariable);
echo "</pre>";

ไม่สามารถรับค่าใช้จ่ายที่ต่ำกว่านี้ได้อีกแล้ว!


0

ฉันเขียนคลาสเล็ก ๆ ที่คล้ายกับ Krumo แต่ฝังลงในแอปได้ง่ายกว่ามาก

นี่คือลิงค์: https://github.com/langpavel/PhpSkelet/blob/master/Classes/Debug.php

และตัวอย่างผลลัพธ์ที่นี่: http://langpavel.php5.cz/debug_sample.html


การสาธิตเสียแม้ว่ารหัสจะมีอยู่ใน GitHub
Mawg บอกว่าคืนสถานะ Monica

0

แนะนำของฉันแก้ปัญหาจากhttps://github.com/hazardland/debug.phpซึ่งเป็นห้องสมุดที่มีฟังก์ชั่นที่มีเพียงคนเดียวที่มีชื่อเป็นการแก้ปัญหา (คุณก็สามารถคัดลอกฟังก์ชันที่ในโครงการของคุณหรือในห้องสมุดของคุณ) ผลลัพธ์ html debug ()ทั่วไปมีลักษณะดังนี้:

ป้อนคำอธิบายภาพที่นี่

แต่คุณสามารถส่งออกข้อมูลเป็นข้อความธรรมดาที่มีฟังก์ชั่นเดียวกันได้เช่นกัน (ด้วยแท็บที่เยื้องช่องว่าง 4 ช่อง) เช่นนี้ (และแม้แต่บันทึกในไฟล์หากจำเป็น):

string : "Test string"
boolean : true
integer : 17
float : 9.99
array (array)
    bob : "alice"
    1 : 5
    2 : 1.4
object (test2)
    another (test3)
        string1 : "3d level"
        string2 : "123"
        complicated (test4)
            enough : "Level 4"

0

TVarDumper

นี่เป็นเครื่องมือที่ยอดเยี่ยมที่มีไว้เพื่อแทนที่ฟังก์ชัน PHP ที่มีข้อบกพร่องvar_dumpและprint_rเนื่องจากสามารถระบุวัตถุที่อ้างอิงซ้ำได้อย่างถูกต้องในโครงสร้างวัตถุที่ซับซ้อน นอกจากนี้ยังมีการควบคุมเชิงลึกแบบวนซ้ำเพื่อหลีกเลี่ยงการแสดงผลแบบวนซ้ำไม่ จำกัด ของตัวแปรที่แปลกประหลาดบางตัว

ดู: TVarDumper.php.


สำหรับการแก้ปัญหาทางเลือกอื่น ๆ ซึ่งมีข้อได้เปรียบมากขึ้นvar_dumpและprint_rและสามารถรองรับการอ้างอิงแบบวงกลมโปรดตรวจสอบ: การใช้ print_r และ var_dump มีการอ้างอิงแบบวงกลม


สำหรับแนวคิดเพิ่มเติมโปรดตรวจสอบด้วย: คุณแก้จุดบกพร่องสคริปต์ PHP ได้อย่างไร


0

ของฉันง่ายกว่าสำหรับฉันฉันไม่มีความรู้ / เวลามากพอที่จะเปลี่ยนโครงสร้างพื้นฐานติดตั้ง xdebug ฯลฯ เป็นต้น

และในกรณีอื่น ๆ คุณไม่ต้องการอะไรมากสำหรับเว็บไซต์ WP ง่ายๆเช่น

ดังนั้นฉันจึงใช้:

highlight_string("\n<?" . var_export($var, true) . "?>\n");

นั่นช่วยฉันได้มากจริงๆ

แต่เพราะฉันชอบสภาพแวดล้อม DevConsole ฉันจึงใช้ฟังก์ชันที่ยอดเยี่ยม แต่เรียบง่ายนี้:

https://codeinphp.github.io/post/outputting-php-to-browser-console/

ปรับแต่งเล็กน้อย:

<?php 

/**
 * Logs messages/variables/data to browser console from within php
 *
 * @param $name: message to be shown for optional data/vars
 * @param $data: variable (scalar/mixed) arrays/objects, etc to be logged
 * @param $jsEval: whether to apply JS eval() to arrays/objects
 *
 * @return none
 * @author Sarfraz
 */
function logConsole($name, $data = NULL, $jsEval = FALSE)
{
     if (! $name) return false;

     $isevaled = false;
     $type = ($data || gettype($data)) ? 'Type: ' . gettype($data) : '';

     if ($jsEval && (is_array($data) || is_object($data)))
     {
          $data = 'eval(' . preg_replace('#[\s\r\n\t\0\x0B]+#', '', json_encode($data)) . ')';
          $isevaled = true;
     }
     else
     {
          $data = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
     }

     # sanitalize
     $data = $data ? $data : '';
     $search_array = array("#'#", '#""#', "#''#", "#\n#", "#\r\n#");
     $replace_array = array('"', '', '', '\\n', '\\n');
     $data = preg_replace($search_array,  $replace_array, $data);
     $data = ltrim(rtrim($data, '"'), '"');
     $data = $isevaled ? $data : ($data[0] === "'") ? $data : "'" . $data . "'";

$js = <<<JSCODE
\n<script>
// fallback - to deal with IE (or browsers that don't have console)
if (! window.console) console = {};
console.log = console.log || function(name, data){};
// end of fallback

console.log('===== PHP Dump =====');
console.log('$name');
console.log('$type');
console.log($data);
console.log('===== / PHP Dump =====');
console.log('\\n');
</script>
JSCODE;

     echo $js;
} # end logConsole

0

อีกทางเลือกหนึ่งคือ

composer require symfony/var-dumper --save-dev

จากนั้นในไฟล์ของคุณคุณเพียงแค่ใช้dump($var) และคุณจะได้ผลลัพธ์เช่นนั้นป้อนคำอธิบายภาพที่นี่


0

ฉันต้องเพิ่มคำตอบอื่นที่นี่เพราะฉันไม่ต้องการทำตามขั้นตอนในโซลูชันอื่น ๆ มันง่ายมากและไม่ต้องใช้ส่วนขยายรวมถึง ฯลฯ และเป็นสิ่งที่ฉันชอบ มันง่ายมากและเร็วมาก

อันดับแรกเพียง json_encode ตัวแปรที่เป็นปัญหา:

echo json_encode($theResult);

คัดลอกผลลัพธ์ที่คุณได้รับไปยัง JSON Editor ที่http://jsoneditoronline.org/เพียงแค่คัดลอกลงในบานหน้าต่างด้านซ้ายคลิกคัดลอก>และพิมพ์ JSON ในรูปแบบต้นไม้ที่สวยงามจริงๆ

สำหรับแต่ละคน แต่หวังว่านี่จะช่วยให้คนอื่นมีทางเลือกที่ดีอีกทางหนึ่ง! :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.