Menu

Heredoc dan Nowdoc PHP: String Multibaris

Heredoc PHP adalah string multibaris yang diawali <<<EOT dan diakhiri EOT; isinya mengganti variabel seperti string dengan tanda kutip ganda. Nowdoc, <<<'EOT', menjaga teks persis seperti yang ditulis. Pelajari sintaks, aturan indentasi, interpolasi array dan object, serta template HTML.

Halaman ini dilengkapi editor yang bisa dijalankan. Edit, jalankan, dan lihat output-nya seketika.

Heredoc adalah string multibaris. Mulai dengan <<<EOT, tulis teksnya di baris-baris berikutnya, lalu akhiri dengan EOT; di barisnya sendiri. Variabel di dalamnya diganti seperti di string dengan tanda kutip ganda.

Identifier-nya (di sini EOT) berupa huruf atau underscore yang diikuti huruf, angka, atau underscore. Orang biasanya memilih nama yang menjelaskan isi teksnya: HTML, SQL, TEXT. Beberapa editor, termasuk PhpStorm, menyorot body-nya sebagai bahasa tersebut jika namanya HTML atau SQL.

Membuat template HTML dengan heredoc

Heredoc adalah cara paling jelas untuk menulis blok HTML yang berisi nilai, karena markup-nya tetap berbentuk aslinya dan tidak ada yang perlu di-escape. Output-nya berupa HTML, jadi editor menampilkannya di tab Halaman.

Ada dua detail di blok itu: elemen array dibungkus kurung kurawal, {$product['name']}, dan tanda dolar literal sebelum harga di-escape sebagai \$. Ubah namanya atau tambahkan tag, lalu jalankan lagi.

Nilai dari pengguna harus di-escape sebelum dimasukkan ke HTML. Lihat htmlspecialchars untuk alasan dan caranya.

Nowdoc: teks tanpa interpolasi

Nowdoc menaruh identifier di dalam tanda kutip tunggal: <<<'EOT'. Tidak ada yang diganti di dalamnya, jadi tanda dolar dan backslash tetap seperti yang ditulis. Pakai untuk contoh kode, regular expression, dan teks apa pun yang berisi $.

Memberi indentasi pada penanda penutup

Sejak PHP 7.3, penanda penutup boleh diberi indentasi, dan indentasi itu dihapus dari setiap baris body. Dengan begitu heredoc di dalam fungsi atau if bisa mengikuti indentasi kode tanpa spasinya ikut masuk ke string.

Baris json_encode membuat hasilnya terlihat karakter demi karakter: 8 spasi dihapus dari setiap baris, karena TEXT; penutupnya diberi indentasi 8 spasi.

Baris body yang indentasinya lebih sedikit daripada penanda penutup adalah parse error:

$html = <<<HTML
  <p>Hello</p>
    HTML;
PHP Parse error:  Invalid body indentation level (expecting an indentation level of at least 4) in /home/index.php on line 3

Array, object, dan pemanggilan method di dalam heredoc

Heredoc mengikuti aturan yang sama dengan tanda kutip ganda. Variabel sederhana bisa ditulis begitu saja; untuk key array di dalam tanda kutip, array bersarang, property, dan pemanggilan method, pakai kurung kurawal.

Heredoc sebagai argumen fungsi

Sejak PHP 7.3, penanda penutup boleh diikuti kode lain di baris yang sama, jadi heredoc bisa langsung diberikan ke fungsi atau dimasukkan ke array. Dengan sprintf, kamu mendapatkan template yang placeholder-nya diisi belakangan.

Kesalahan umum: titik koma hilang atau teks tambahan setelah penanda

Identifier penutup harus ditulis persis seperti saat dibuka (huruf besar dan kecilnya sama), dan apa pun yang mengikutinya di baris itu harus masuk akal sebagai PHP. EOT; mengakhiri pernyataan, EOT, melanjutkan daftar argumen. Huruf atau angka tepat setelah penanda (EOTX;) menyembunyikannya, sehingga string berlanjut sampai akhir file dan PHP melaporkan syntax error, unexpected end of file. Jebakan sebaliknya adalah baris body yang diawali identifier lalu diikuti spasi atau tanda baca, seperti EOT is the marker: baris itu mengakhiri string terlalu cepat, dan sisa barisnya dibaca sebagai PHP (syntax error, unexpected identifier "is"). Pilih identifier yang tidak pernah muncul di awal baris dalam teksnya, seperti HTML untuk markup atau SQL untuk query.

Pertanyaan yang sering diajukan

Apa itu heredoc di PHP?

Cara menulis string multibaris tanpa tanda kutip: mulai dengan <<<EOT dan baris baru, tulis teksnya, lalu akhiri dengan EOT; di barisnya sendiri. Variabel di dalamnya diganti, persis seperti di string dengan tanda kutip ganda, dan kamu bebas memakai " dan '.

Apa perbedaan heredoc dan nowdoc?

Heredoc (<<<EOT) mengganti variabel dan escape sequence seperti string dengan tanda kutip ganda. Nowdoc (<<<'EOT', identifier di dalam tanda kutip tunggal) tidak melakukan keduanya dan menjaga setiap $ dan backslash seperti yang ditulis, seperti string dengan tanda kutip tunggal.

Bolehkah penanda penutup heredoc diberi indentasi?

Boleh, sejak PHP 7.3. Indentasi penanda penutup dihapus dari setiap baris body, jadi kamu bisa memberi indentasi pada heredoc agar sesuai dengan kodemu. Setiap baris body harus diberi indentasi setidaknya sejauh penanda penutup, kalau tidak PHP berhenti dengan parse error.

Bagaimana cara memanggil fungsi di dalam heredoc?

Heredoc hanya menginterpolasi variabel, elemen array, property, dan pemanggilan method. Panggil fungsinya dulu dan simpan hasilnya, atau simpan nama fungsi atau closure di variabel lalu panggil di dalam kurung kurawal: $e = 'htmlspecialchars'; lalu {$e($text)}.

Ilustrasi bahasa pemrograman di Coddy

Belajar coding dengan Coddy

Mulai