PHP var_dump เทียบเท่ากับ Java อะไร


127

PHP มีฟังก์ชันvar_dump ()ซึ่งแสดงเนื้อหาภายในของวัตถุโดยแสดงประเภทและเนื้อหาของวัตถุ

ตัวอย่างเช่น:

class Person {
  private $firstName;
  private $lastName;

  public function __construct($firstName, $lastName) {
    $this->firstName = $firstName;
    $this->lastName = $lastName;
  }
}

$person = new Person('Jon', 'Smith');
var_dump($person);

จะส่งออก:

object(Person)#1 (2) {
  ["firstName:private"]=>
  string(3) "Jon"
  ["lastName:private"]=>
  string(5) "Smith"
}

สิ่งที่เทียบเท่าใน Java ที่จะทำเช่นเดียวกัน?


1
คุณลอง db4o หรือยัง ไม่ใช่เฉพาะสำหรับสิ่งนี้ แต่ฉันคิดว่าจะทำงานได้อย่างสมบูรณ์แบบ
Aquarius Power

คำตอบ:


67

มันไม่เหมือนกับการอบใน Java ดังนั้นคุณจึงไม่ได้รับสิ่งนี้ฟรี มันทำด้วยแบบแผนมากกว่าโครงสร้างภาษา ในคลาสการถ่ายโอนข้อมูลทั้งหมด (และอาจจะเป็นในทุกคลาสที่คุณเขียน ... ) คุณควรใช้toStringวิธีการที่เหมาะสม ดังนั้นที่นี่คุณต้องแทนที่toString()ในPersonชั้นเรียนของคุณและส่งคืนสถานะที่ต้องการ

มียูทิลิตี้ที่ช่วยในการเขียนวิธี toString ที่ดีหรือ IDE ส่วนใหญ่มีtoString()ทางลัดการเขียนอัตโนมัติ



ดูstackoverflow.com/questions/9444573/…ใน Guava Alternative และ Intellij IDEA template
Vadzim

31

จากประสบการณ์ของฉันโดยทั่วไปแล้ว var_dump จะใช้สำหรับการดีบัก PHP แทนการดีบักแบบทีละขั้นตอน ใน Java คุณสามารถใช้ดีบักเกอร์ IDE ของคุณเพื่อดูการแสดงเนื้อหาของวัตถุด้วยภาพ


10
Yups, PHP หรือ Web Developer ส่วนใหญ่ลืมเกี่ยวกับการดีบัก เนื่องจากพวกเขาชอบดูผลการแก้ไขข้อบกพร่องในเบราว์เซอร์
GusDeCooL

10
คุณไม่สามารถใช้ดีบักเกอร์ของ IDE ได้เช่นหากคุณกำลังเขียนโปรแกรมโค้ด JSP ของคุณในโปรแกรมแก้ไขที่ใช้เบราว์เซอร์ของ Adobe Experience Manager :(
Trevor

บางทีเราอาจใช้เพื่อทดสอบพฤติกรรมของโปรแกรมของคุณในสภาพแวดล้อมแบบสดโดยการพิมพ์ vardump ในรูปแบบ html
omjego

18

ทางเลือกอื่นของคุณคือการแทนที่toString()วิธีการของวัตถุของคุณเพื่อส่งออกเนื้อหาในแบบที่คุณต้องการหรือใช้การสะท้อนกลับเพื่อตรวจสอบวัตถุ (ในลักษณะที่คล้ายกับสิ่งที่ผู้แก้ปัญหาทำ)

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

รหัสนี้จะแสดงรายการฟิลด์และค่าสำหรับObject"o"

Field[] fields = o.getClass().getDeclaredFields();
for (int i=0; i<fields.length; i++)
{
    System.out.println(fields[i].getName() + " - " + fields[i].get(o));
}

คุณกำลังใช้ฟิลด์อะไรนำเข้าจากที่ไหน
RMiranda

3
java.lang.reflect.Field
Harry Lime

17

ฉันคิดว่าวิธีที่ดีที่สุดคือใช้ google-gson (ไลบรารี Java เพื่อแปลง JSON เป็นวัตถุ Java และในทางกลับกัน)

ดาวน์โหลดเพิ่มไฟล์ "jar" ในโครงการของคุณ

HashMap<String, String> map = new HashMap<String, String>();

map.put("key_1", "Baku");
map.put("key_2", "Azerbaijan");
map.put("key_3", "Ali Mamedov");

Gson gson = new Gson();

System.out.println(gson.toJson(map));

เอาท์พุท:

{"key_3":"Ali Mamedov","key_2":"Azerbaijan","key_1":"Baku"}

คุณสามารถแปลงวัตถุ (อาร์เรย์รายการและอื่น ๆ ) เป็น JSON ฉันคิดว่ามันเป็นอะนาล็อกที่ดีที่สุดของvar_dump ()ของ PHP


4
น่าสนใจ ... คุณรู้หรือไม่ว่าทำไมถึงไม่เป็นวิธีคง
mirelon

2
คุณสามารถใช้มันเหมือนกับวิธีการคงที่: new Gson (). toJson (... ) โดยไม่ต้องสร้างตัวแปรใหม่
Ali Mamedov

Imo จะดีกว่าถ้าคุณแยกมันลงในคลาสยูทิลิตี้ที่กำหนดเองแทนที่จะใช้โดยตรงซึ่งจะช่วยให้คุณมีความยืดหยุ่นในการจัดการการอ้างอิงของบุคคลที่สาม
MAYOBYO HASSAN

7

แพ็กเกจ lang ของ apache commons จัดเตรียมคลาสดังกล่าวซึ่งสามารถใช้เพื่อสร้างเมธอด toString () ดีฟอลต์โดยใช้การสะท้อนเพื่อรับค่าของฟิลด์ เพียงแค่มีลักษณะที่นี้


ลิงค์ที่อัปเดตคือcommons.apache.org/lang/api-release/org/apache/commons/lang/…
brian_d

ลิงก์ทั้งสองนั้นตายแล้ว
beiller


4

ฉันชอบใช้ GSON เพราะมักจะขึ้นอยู่กับประเภทของโครงการที่ฉันกำลังทำอยู่แล้ว:

public static String getDump(Object o) {
    return new GsonBuilder().setPrettyPrinting().create().toJson(o);
}

หรือแทนที่ GSON สำหรับไลบรารี JSON อื่น ๆ ที่คุณใช้



0

การทำให้เป็นอนุกรม XML ของคุณและคุณควรได้รับการแสดงที่ประณีตแม้กระทั่งวัตถุที่ซ้อนกันลึก ๆ


0

ฉันคิดว่าสิ่งที่คล้ายกันที่คุณทำได้คือการสร้างวิธีง่ายๆที่จะพิมพ์วัตถุที่คุณต้องการดู สิ่งนี้:

public static void dd(Object obj) { System.out.println(obj); }

ไม่เหมือนกับ var_dump () แต่คุณสามารถเข้าใจแนวคิดทั่วไปได้โดยไม่จำเป็นต้องไปที่ IDE ของดีบักเกอร์


0

เพียงเพื่อ addup บนโซลูชันฟิลด์ (setAccessible) เพื่อให้คุณสามารถเข้าถึงตัวแปรส่วนตัวของวัตถุ:

public static void dd(Object obj) throws IllegalArgumentException, IllegalAccessException {
    Field[] fields = obj.getClass().getDeclaredFields();
    for (int i=0; i<fields.length; i++)
    {
        fields[i].setAccessible(true);
        System.out.println(fields[i].getName() + " - " + fields[i].get(obj));
    } 

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