Apa keuntungan menggunakan heredoc di PHP? [Tutup]

196

Apa keuntungan menggunakan heredoc di PHP, dan dapatkah Anda menunjukkan contoh?

danidacar
sumber
4
Tidak ada alasan kuat mengapa alternatif lebih baik daripada heredocs
Shakti Singh
18
Saya telah mengedit ini agar lebih konstruktif, dan menjadikan komunitas pertanyaan wiki karena cukup subyektif. Catatan, Komunitas mungkin masih menutup ini, saya memilih untuk membiarkannya terbuka karena Anda mendapatkan jawaban yang berkualitas.
Tim Post
9
Mengapa sebenarnya pertanyaan ini tidak dianggap konstruktif?
Ambo100

Jawaban:

218

Sintaks heredoc jauh lebih bersih bagi saya dan sangat berguna untuk string multi-line dan menghindari masalah mengutip. Kembali pada hari saya biasa menggunakannya untuk membangun query SQL:

$sql = <<<SQL
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = "widgets"
SQL;

Bagi saya ini memiliki kemungkinan lebih rendah untuk memperkenalkan kesalahan sintaks daripada menggunakan kutipan:

$sql = "
select *
  from $tablename
 where id in [$order_ids_list]
   and product_name = \"widgets\"
";

Poin lainnya adalah untuk menghindari keluarnya tanda kutip ganda dalam string Anda:

$x = "The point of the \"argument" was to illustrate the use of here documents";

PProblem dengan hal di atas adalah kesalahan sintaksis (kutipan yang hilang yang hilang) yang baru saja saya perkenalkan sebagai lawan dari sintaks dokumen di sini:

$x = <<<EOF
The point of the "argument" was to illustrate the use of here documents
EOF;

Ini sedikit gaya, tapi saya menggunakan yang berikut ini sebagai aturan untuk dokumen tunggal, ganda dan di sini untuk mendefinisikan string:

  • Kutipan tunggal digunakan ketika string seperti konstan'no variables here'
  • Kutipan ganda ketika saya bisa meletakkan string pada satu baris dan membutuhkan interpolasi variabel atau kutipan tunggal yang tertanam"Today is ${user}'s birthday"
  • Di sini mendokumentasikan string multi-line yang memerlukan pemformatan dan interpolasi variabel.
Wes
sumber
40
Nitpick pada contoh SQL Anda: Anda tidak harus menggunakan tanda kutip ganda di sana di tempat pertama. Itu hanya bekerja dengan MySQL, dan hanya ketika server itu tidak berjalan dalam --ansimode yang sesuai. String SQL harus menggunakan tanda kutip tunggal.
mario
17
@ Mario Itu untuk ilustrasi masalah dengan menggunakan tanda kutip ganda pada umumnya bukan tentang spesifikasi sql
Wes
4
Bukan untuk mengatakan bahwa menempatkan variabel ke dalam kueri secara langsung adalah perilaku buruk, buruk :-P
Akal Sehat Anda
5
@Wes dan @mario Ini adalah ANSI SQL:SELECT * FROM "order" WHERE "table"='1'
programath
11
"Bukan untuk mengatakan bahwa menempatkan variabel ke dalam kueri secara langsung adalah perilaku buruk, buruk". Ini tidak benar sama sekali. Menempatkan input yang tidak divalidasi ke dalam pernyataan SQL adalah "perilaku buruk". Menempatkan variabel di dalam pernyataan SQL terkadang diperlukan.
vogomatix
67

Heredoc's adalah alternatif yang bagus untuk string yang dikutip karena peningkatan keterbacaan dan pemeliharaan. Anda tidak harus keluar dari kutipan dan (baik) IDE atau editor teks akan menggunakan penyorotan sintaksis yang tepat.

Contoh yang sangat umum: menggema HTML dari dalam PHP:

$html = <<<HTML
  <div class='something'>
    <ul class='mylist'>
      <li>$something</li>
      <li>$whatever</li>
      <li>$testing123</li>
    </ul>
  </div>
HTML;

// Sometime later
echo $html;

Mudah dibaca dan mudah dirawat.

Alternatifnya adalah menggemakan string yang dikutip, yang akhirnya mengandung kutipan yang lolos dan IDE tidak akan menyoroti sintaksis untuk bahasa itu, yang mengarah pada keterbacaan yang buruk dan lebih banyak kesulitan dalam pemeliharaan.

Jawaban yang diperbarui untuk Akal Sehat Anda

Tentu saja Anda tidak ingin melihat kueri SQL yang disorot sebagai HTML. Untuk menggunakan bahasa lain, cukup ubah bahasa di sintaks:

$sql = <<<SQL
       SELECT * FROM table
SQL;
Jake Wilson
sumber
1
Apakah Anda mengetahui fitur PHP " escape from PHP "?
Akal Sehat Anda
5
Kadang-kadang melarikan diri dari PHP baik-baik saja, tetapi ketika Anda menggemakan banyak hal, sintaks Anda menyoroti jeda, Anda harus mengetik lebih banyak karakter dengan keluar dari PHP dan PHP memiliki lebih banyak perintah untuk dieksekusi daripada satu gema. Selain itu, Anda dapat mengatur string Heredoc ke variabel dan mengulanginya nanti. Melarikan diri dari PHP ke HTML Anda berarti ia dicetak di sana-sini. Tidak dapat menyimpannya untuk nanti.
Jake Wilson
2
1. Anda dapat menggunakan buffering output untuk menyimpan output. 2. Anda menggunakan gema dalam contoh pertama Anda. 3. (baik) IDE atau editor teks JANGAN PERNAH memecahkan sorotan HTML ketika Anda menggunakan pelarian dari PHP. 4. IDE apa yang disoroti oleh sintaks untuk HEREDOC dan aturan bahasa apa yang digunakan? Apakah saya tetap bisa melihat permintaan SQL disorot sebagai teks HTML?
Akal Sehat Anda
1
Heredoc adalah string PHP. Tentu saja Anda tidak dapat menggunakan struktur kontrol dalam sebuah string. php.net/manual/en/language.types.string.php
Jake Wilson
11
Saya pikir Anda salah memahami Heredoc hanya berlaku untuk string HTML. Heredoc hanyalah cara alternatif untuk mendefinisikan string, apakah itu HTML atau query SQL atau apa pun yang Anda inginkan. Mereka lebih mudah untuk menulis dan memelihara, jawaban Wes di atas menunjukkan bahwa cukup jelas (yang jika Anda perhatikan memiliki penyorotan sintaks yang benar. Jangan mengeluh kepada saya tentang kegagalan NetBeans). Saya tidak yakin mengapa Anda tampaknya sangat ingin memberi suara pada jawaban pertanyaan wiki komunitas ... Percaya atau tidak, pengembang PHP asli mungkin menyertakan Heredoc di PHP karena mungkin sebenarnya berguna dalam beberapa kasus .. .
Jake Wilson
8

Beberapa IDE menyoroti kode dalam string heredoc secara otomatis - yang membuat penggunaan heredoc untuk XML atau HTML menarik secara visual.

Saya pribadi suka untuk bagian yang lebih panjang yaitu XML karena saya tidak perlu peduli mengutip karakter kutipan dan hanya bisa menempelkan XML.

cweiske
sumber
6

Pertama-tama, semua alasan bersifat subjektif. Ini lebih seperti masalah selera daripada alasan.

Secara pribadi, saya menemukan heredoc sangat tidak berguna dan menggunakannya sesekali, sebagian besar waktu ketika saya perlu memasukkan beberapa HTML ke dalam variabel dan tidak ingin repot dengan buffering keluaran, untuk membentuk pesan email HTML misalnya.

Memformat tidak cocok dengan aturan indentasi umum, tapi saya rasa ini bukan masalah besar.

       //some code at it's proper level
       $this->body = <<<HERE
heredoc text sticks to the left border
but it seems OK to me.
HERE;
       $this->title = "Feedback";
       //and so on

Adapun contoh dalam jawaban yang diterima, itu hanya curang.
Contoh-contoh string, pada kenyataannya, menjadi lebih ringkas jika seseorang tidak akan menipu mereka

$sql = "SELECT * FROM $tablename
        WHERE id in [$order_ids_list]
        AND product_name = 'widgets'";

$x = 'The point of the "argument" was to illustrate the use of here documents';
Akal Sehat Anda
sumber
3

Saya tidak tahu apakah saya akan mengatakan heredoc itu malas. Orang dapat mengatakan bahwa melakukan apa pun adalah kemalasan, karena selalu ada cara yang lebih rumit untuk melakukan apa pun.

Misalnya, dalam situasi tertentu Anda mungkin ingin menampilkan teks, dengan variabel tertanam tanpa harus mengambil dari file dan menjalankan penggantian templat. Heredoc memungkinkan Anda untuk melupakan keharusan melepaskan diri dari kutipan, jadi teks yang Anda lihat adalah teks yang Anda hasilkan. Jelas ada beberapa negatif, misalnya, Anda tidak dapat membuat indentasi heredoc Anda, dan itu bisa membuat frustasi dalam situasi tertentu, terutama jika Anda ngotot untuk sintaksis terpadu, yang saya.

baru
sumber