Apa yang setara dengan Java var_dump PHP?

127

PHP memiliki fungsi var_dump () yang menampilkan konten internal suatu objek, menampilkan jenis dan konten objek.

Sebagai contoh:

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);

akan menampilkan:

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

Apa yang setara di Jawa yang akan melakukan hal yang sama?

Jon Cram
sumber
1
Sudahkah Anda mencoba db4o? ini tidak khusus untuk ini, tetapi saya pikir akan bekerja dengan sempurna;
Aquarius Power

Jawaban:

67

Ini tidak cukup seperti dipanggang di Jawa, jadi Anda tidak mendapatkan ini secara gratis. Ini dilakukan dengan konvensi daripada konstruksi bahasa. Di semua kelas transfer data (dan mungkin bahkan di semua kelas yang Anda tulis ... ), Anda harus menerapkan yang masuk akaltoString metode yang . Jadi di sini Anda perlu menimpa toString()di Personkelas Anda dan mengembalikan negara yang diinginkan.

Ada beberapa utilitas yang tersedia untuk membantu menulis metode toString yang baik, atau sebagian besar IDE memiliki toString()pintasan penulisan otomatis .

serg10
sumber
31

Dalam pengalaman saya, var_dump biasanya digunakan untuk debugging PHP di tempat debugger langkah-meskipun. Di Jawa, tentu saja Anda dapat menggunakan debugger IDE Anda untuk melihat representasi visual dari konten suatu objek.

Chase Seibert
sumber
10
Yups, sebagian besar Pengembang PHP atau Web lupa tentang debugging. Karena mereka lebih suka melihat hasil debug di browser.
GusDeCooL
10
Anda tidak dapat menggunakan debugger IDE Anda jika, misalnya, Anda memprogram kode JSP Anda di editor berbasis browser Adobe Experience Manager. :(
Trevor
Mungkin kita dapat menggunakannya untuk menguji perilaku program Anda di lingkungan langsung dengan mencetak vardump dalam format html.
omjego
18

Alternatif Anda adalah mengesampingkan toString()metode objek Anda untuk menampilkan kontennya dengan cara yang Anda sukai, atau menggunakan refleksi untuk memeriksa objek (dengan cara yang mirip dengan apa yang dilakukan oleh para penentang).

Keuntungan menggunakan refleksi adalah bahwa Anda tidak perlu memodifikasi objek individual Anda untuk menjadi "analysable", tetapi ada kompleksitas tambahan dan jika Anda memerlukan dukungan objek bersarang Anda harus menulis itu.

Kode ini akan mencantumkan bidang dan nilainya untuk 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));
}
Harry Lime
sumber
bidang apa yang Anda gunakan, diimpor dari mana?
RMiranda
3
java.lang.reflect.Field
Harry Lime
17

Saya pikir cara terbaik untuk melakukannya adalah menggunakan google-gson (Pustaka Java untuk mengonversi JSON menjadi objek Java dan sebaliknya)

Unduh , tambahkan file "jar" ke proyek Anda

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));

Keluaran:

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

Anda dapat mengonversi objek apa pun (array, daftar, dan lain-lain) menjadi JSON. Saya pikir, itu adalah analog terbaik dari PHP var_dump ()

Ali Mamedov
sumber
4
Menarik ... tahukah Anda mengapa ini bukan metode statis?
mirelon
2
Anda dapat menggunakannya seperti metode statis: new Gson (). ToJson (...) tanpa membuat variabel baru.
Ali Mamedov
Imo, lebih baik jika Anda abstrakkan ke kelas utilitas khusus daripada menggunakannya secara langsung, ini memberi Anda fleksibilitas untuk mengelola dependensi pihak ketiga
MAYOBYO HASSAN
4

Saya menggunakan Jestr dengan hasil yang masuk akal.

brmiller
sumber
4

Saya suka menggunakan GSON karena seringkali sudah menjadi ketergantungan dari jenis proyek yang saya kerjakan:

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

Atau gantikan GSON untuk perpustakaan JSON lain yang Anda gunakan.

mattalxndr
sumber
0

Anda XMLisasi serialisasi, dan Anda harus mendapatkan representasi yang sangat rapi bahkan dari objek yang sangat bersarang.

Daniel
sumber
0

Saya pikir hal serupa yang dapat Anda lakukan adalah membuat metode sederhana yang mencetak objek yang ingin Anda lihat. Sesuatu seperti ini:

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

Ini tidak sama seperti var_dump (), tetapi Anda bisa mendapatkan gambaran umum tentang itu, tanpa harus pergi ke IDE debugger Anda.

Necare
sumber
0

Hanya untuk addup pada solusi Field (setAccessible) sehingga Anda dapat mengakses variabel pribadi dari suatu objek:

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));
    } 

}
Stephane
sumber