Apakah praktik yang buruk untuk menggunakan tag <? = Di PHP?

190

Saya telah menemukan tag PHP ini <?= ?>baru-baru ini dan saya enggan menggunakannya, tetapi sangat gatal sehingga saya ingin Anda menerimanya. Aku tahu itu adalah praktik buruk untuk menggunakan tag pendek <? ?>dan bahwa kita harus menggunakan tag penuh <?php ?>sebaliknya, tapi bagaimana satu ini: <?= ?>?

Ini akan menghemat pengetikan dan akan lebih baik untuk keterbacaan kode, IMO. Jadi alih-alih ini:

<input name="someVar" value="<?php echo $someVar; ?>">

Saya bisa menulis seperti ini, yang lebih bersih:

<input name="someVar" value="<?= $someVar ?>">

Apakah menggunakan operator ini disukai?

marco-fiset
sumber
11
Masalah dengan pertanyaan semacam ini adalah bahwa itu sangat keras kepala. "Secara teknis" tidak ada cara yang benar atau salah. Beberapa berpendapat, sebagian menentang, semua preferensi. Jadi pada akhirnya terserah Anda.
mseancole
Hindari tag penutup dalam bentuk apa pun, jika Anda bisa - yaitu file hanya berisi kode php (tanpa html dll). Jika Anda memiliki tag penutup, karakter apa pun setelahnya akan di-output ke browser (untuk aplikasi web) - yang dapat mengakibatkan masalah debug yang sangat sulit. Untuk lebih lanjut: stackoverflow.com/a/4453835/49560
dharm0us
Non-opini terkait: Hati-hati karena echomengarah sangat mudah ke XSS, dan Anda harus lebih bergantung pada metode gema konteks khusus (yaitu: memiliki function html($x) { echo htmlentities($x,...); }dan html($someVar);bukan sebagai gantinya echo $someVaratau menggunakan echo json_encode($x);untuk konteks JS). Ini kemudian membuat <?=tag menjadi praktik yang buruk karena itu berarti Anda telah melepaskan HTML dari konten variabel di tempat lain, dan agar tempat lain secara ajaib tahu bahwa variabel ini harus di-HTML-kan karena itu digema dalam konteks HTML.
Xenos

Jawaban:

211

Sejarah

Sebelum kereta informasi yang keliru keluar terlalu jauh dari stasiun, ada banyak hal yang perlu Anda pahami tentang tag pendek PHP.

Masalah utama dengan tag pendek PHP adalah bahwa PHP berhasil memilih tag ( <?) yang digunakan oleh sintaks lain, XML .

Dengan opsi yang diaktifkan, Anda tidak dapat membuat output mentah dari deklarasi xml tanpa mendapatkan kesalahan sintaksis:

<?xml version="1.0" encoding="UTF-8" ?>

Ini adalah masalah besar ketika Anda mempertimbangkan seberapa umum penguraian dan manajemen XML.

Bagaimana dengan <?=?

Meskipun <?menyebabkan konflik dengan xml, <?= tidak . Sayangnya, opsi untuk mengaktifkan dan menonaktifkannya terkait short_open_tag, yang berarti bahwa untuk mendapatkan manfaat dari tag gema pendek ( <?=), Anda harus berurusan dengan masalah tag buka pendek ( <?). Masalah yang terkait dengan tag terbuka pendek jauh lebih besar daripada manfaat dari tag gema pendek, sehingga Anda akan menemukan sejuta setengah rekomendasi untuk short_open_tagdimatikan, yang seharusnya Anda lakukan .

Dengan PHP 5.4, namun tag gema pendek telah diaktifkan kembali terpisah dari short_open_tagopsi. Saya melihat ini sebagai dukungan langsung dari kenyamanan <?=, karena tidak ada yang salah dengan itu.

Masalahnya adalah Anda tidak dapat menjamin bahwa Anda akan memilikinya <?=jika Anda mencoba menulis kode yang dapat bekerja dalam versi PHP yang lebih luas.

ok, jadi sekarang itu semua keluar dari jalan

Haruskah Anda gunakan <?=?

flowchart tentang apakah menggunakan tag gema pendek atau tidak

zzzzBov
sumber
71
Saya tidak setuju dengan diagram tajam Anda. Jawaban yang benar adalah 99,99% YA karena sebagian besar lingkungan produksi dikonfigurasi untuk menggunakan tag pendek. Seandainya Anda gagal dan mereka menghapus <?=di masa depan Anda dapat memperbaikinya dalam waktu kurang dari satu menit, tidak peduli berapa banyak ribuan file yang menggunakannya, Anda hanya perlu mencari & mengganti <?=untuk seluruh proyek <?php echo . Jawaban saya adalah jangan khawatir dan gunakan saja , manfaatnya melebihi konsekuensinya. <?=tidak dianggap sebagai tag pendek lagi, Rasmus Lerdorf sendiri membuat itu sangat berkomitmen.
dukeofgaming
32
@dukeofgaming, dari mana Anda mendapatkan data tentang lingkungan produksi yang dikonfigurasikan untuk menggunakan tag pendek? Menonaktifkannya adalah salah satu konfigurasi paling umum yang disarankan yang pernah saya dengar, yang kedua setelah menonaktifkan tanda kutip. Ini juga sama sekali tidak masuk akal untuk memiliki lingkungan pengembang yang berbeda dari produksi.
zzzzBov
4
Tag pendek diaktifkan secara default hingga 5.3 php.net/manual/en/ini.core.php#ini.short-open-tag , sebagian besar layanan hosting yang saya tahu mendukungnya tanpa masalah dan ini adalah salah satu alasan kerangka Kohana digunakan untuk mendorongnya. <?=akan selalu aktif ( stackoverflow.com/a/6064813/156257 ) dan sebagian besar waktu mereka dihidupkan. Anda dapat membuktikan saya salah dengan memeriksa dengan host Anda jika: mereka dinonaktifkan dan menggunakan PHP <5.3 dan jika mereka tidak mengizinkan pengaturan untuk ditimpa oleh pengguna atau atas permintaan khusus; jika semua yang sebelumnya salah, berarti khawatir <?=.
dukeofgaming
6
Anda tidak khawatir yang <?=akan dihapus, dan saya juga. Yang lain mungkin, dan jika mereka, mereka tidak harus menggunakan <?=. Beberapa orang memiliki ketakutan irasional menggunakan fitur bahasa tertentu ( seperti meninggalkan tag penutup di php ).
zzzzBov
8
Itulah tepatnya yang saya maksud: tidak perlu khawatir . Saya hanya akan mengatakan, "Apakah Anda khawatir?" --ya -> "Silakan dan gunakan, tidak perlu khawatir". Ini juga terasa seperti Anda menyiratkan bahwa meninggalkan tag penutup adalah praktik yang buruk, padahal tidak.
dukeofgaming
29

Membersihkan topi PHP saya

Saya pasti akan menyukai penggunaan <?= $someVar ?>lebih dari yang lebih bertele-tele echo(hanya preferensi pribadi). Satu- satunya downside AFAIK adalah untuk pengguna yang menjalankan pre-5.4.0, dalam hal ini short_open_tagharus diaktifkan di php.ini .

Sekarang mengatakan itu, jika proyek Anda bukan OS, maka itu adalah titik diperdebatkan. Jika ya, saya akan mendokumentasikan fakta bahwa short_open_tags harus diaktifkan, atau menggunakan solusi yang lebih portabel dari kedua solusi tersebut.

Demian Brecht
sumber
1
Nitpick: Meskipun <?=tidak terpengaruh oleh short_open_tagPHP 5.4, <?tetap saja dan jika Anda terbiasa menggunakan tag formulir pendek, cukup mudah untuk melupakan apa yang didukung pada versi apa.
yannis
7
@YannisRizos Sangat baik untuk dibedakan <?=sebagai "Saya menghasilkan variabel sekarang" untuk penggunaan gaya template, dan <?phpsebagai "Saya menjalankan banyak kode sekarang". Saya sarankan untuk tidak pernah menggunakan <?, tapi itu baik <?=dan <?phpbaik-baik saja.
Izkata
2
+1 karena Rasmus Lerdorf mendukung tag <? =. Saya menyaksikan salah satu ceramahnya tentang PHP 5.4 (yang akan segera dirilis). Itu sebabnya sejak PHP 5.4.0 tag <? = Selalu tersedia. Saya telah melihat banyak kode pra PHP 5.4 bahwa tag <? = Digunakan dalam Tampilan aplikasi MVC tetapi <? Php ...?> Digunakan dalam file non-view.
programmer
@ Alasan Bukan itu yang saya katakan. "Rasmus mendukung foo" bukan argumen, "Rasmus mendukung foo untuk alasan ini dan itu" namun demikian.
yannis
2
@Yannis Rizos "Rasmus mendukung foo untuk alasan ini dan itu". Terima kasih atas bimbingannya, tetapi alasan saya adalah karena Rasmus Lerdorf mengesahkannya, sebagai pembuat bahasa dan masih memiliki pengaruh pada pengembangan PHP, perubahan dibuat untuk membuat tag <? = Selalu tersedia. Inilah yang seharusnya saya tambahkan ke komentar asli saya "Oleh karena itu praktik menggunakan <? = Dalam pandangan mungkin akan menjadi lebih luas." Dang, saya harus memeriksa tiga kali komentar saya untuk saat ini ... titik ...
programmer
21

Anda harus mencoba menghindari tag formulir pendek, apakah itu <?atau <?=.

Alasan teknis utama adalah portabilitas, Anda tidak pernah dapat memastikan bahwa tag formulir pendek akan bekerja untuk setiap pengaturan yang diberikan, karena mereka dapat dimatikan, cari short_open_tagpetunjuknya. Tetapi Anda selalu dapat benar-benar yakin bahwa bentuk panjang akan bekerja di mana-mana.

Ini akan menghemat pengetikan dan akan lebih baik untuk keterbacaan kode, IMO.

Itu juga kebiasaan buruk. Saya benar-benar tidak dapat memberi tahu Anda apa yang menurut Anda lebih mudah dibaca, tetapi saya tidak suka menggunakan keterbacaan kode sebagai alasan untuk menyelamatkan diri Anda dari beberapa penekanan tombol. Jika Anda khawatir tentang keterbacaan, Anda harus menggunakan mesin template, ini:

<input name="someVar" value="{someVar}">

jauh lebih mudah dibaca dari kedua contoh Anda.

Terakhir, perlu dicatat bahwa tag formulir pendek tidak disarankan secara eksplisit oleh proyek PHP besar, misalnya PEAR dan Zend Framework .

yannis
sumber
14
+1 untuk templat. -1 untuk portabilitas. Ini adalah bahasa sisi server. Tantangan yang harus Anda fokuskan untuk server adalah hal-hal seperti skalabilitas dan keamanan. Itu akan menjadi ide yang sangat buruk untuk menginvestasikan waktu yang serius untuk memastikan itu akan berjalan pada beberapa platform ... (untuk berjaga-jaga!) ...
riwalk
3
@ Stargazer712 Hm? Satu-satunya hal yang perlu Anda lakukan adalah menggunakan standar <?phpdan echobukannya <?dan <?=, apakah Anda menganggap itu sebagai waktu yang serius? Dan apa yang terjadi ketika Anda memindahkan proyek Anda ke server di mana karena alasan tertentu tag pendek dinonaktifkan?
yannis
13
@Yannis: beberapa karakter itu mungkin tidak terlalu banyak, tetapi IMO mereka menambahkan banyak kebisingan.
kevin cline
8
Saya pikir harus disebutkan bahwa tujuan awal PHP adalah untuk menjadi bahasa templat . Menambahkan mesin template lain (lebih mengasapi) di atas PHP tidak mengapung perahu tuna saya. Cukup ikuti praktik yang baik (beberapa kiat bagus ada di sini stackoverflow.com/questions/62617/… ) saat menyandikan PHP yang dicampur dengan HTML dan Anda siap melakukannya.
programmer
2
@Yannis Rizos Ya itu harus disebutkan karena orang yang baru mengenal PHP mungkin berpikir mereka berkewajiban untuk menggunakan mesin templat [whizbang] dalam proyek PHP mereka tanpa mempertimbangkan untuk menggunakan PHP murni sebagai gantinya. Haruskah saya hanya melakukan pemrosesan teks dalam Perl , mungkin tidak tetapi saya pikir sekarang Perl sangat pandai pemrosesan teks - juga dengan PHP dan templating.
programmer
15

The PHP-Dokumentasi jelas mengatakan bahwa Anda dapat menggunakan tag gema pendek dengan aman:

5.4.0 The tag <?= is always available regardless of the short_open_tag ini setting.

Meskipun ini untuk PHP versi 5.4 dan lebih besar tetapi semua orang setidaknya harus menggunakan yang ini. Saya lebih suka mereka untuk tujuan templating saja.

Hexodus
sumber
10

Alasan menggunakan tag pendek:

  • Mereka lebih pendek.

Alasan tidak menggunakan tag pendek:

  • Mereka memperkenalkan satu lagi konfigurasi gotcha - sementara Anda mengontrol server sebagian besar waktu dalam konteks profesional, jika Anda berencana untuk merilis kode Anda kepada masyarakat umum, tag pendek dapat rusak secara tidak merata untuk orang-orang yang menggunakannya, katakanlah, shared hosting .
  • Mereka membuatnya terlalu mudah untuk dengan santai memasukkan string yang tidak bersih ke dalam output Anda. Ini menakutkan karena dapat memperkenalkan kerentanan XSS. Sementara tag panjang tidak melakukan apa-apa secara langsung untuk mencegah hal ini, mereka memberi sinyal kepada programmer bahwa mungkin apa yang mereka lakukan bukanlah hal yang benar, dan mereka harus mulai menggunakan sistem template yang secara otomatis menangani pengkodean HTML untuk mereka sekarang . Mengeluarkan string dinamis dengan tag panjang itu menyakitkan, yang merupakan hal yang baik (mendidik).
tammmer
sumber
Itulah jawaban untuk menerima IMO, bahkan templat tidak akan membuat semuanya aman XSS (data pengguna dalam atribut src skrip akan selalu tidak aman) dan saya tidak tahu apakah mekanisme templat mengetahui konteks gema yang tepat; bagaimana jika variabel PHP berakhir dengan konten tag skrip? Dalam SVG tertanam dalam HTML?
Xenos
@Xenos jelas tergantung pada sistem template yang dimaksud, dan tidak ada peluru perak; tetapi sebagian besar memang mengurangi permukaan bug, dan jumlah skenario di mana ketekunan manual (satu-satunya sumber bug keamanan yang paling penting) diperlukan. "Jangan menaruh konten dinamis dalam tag skrip" lebih mudah diikuti (dan diaudit) daripada "pastikan semua konten dinamis dikodekan HTML dengan benar di mana-mana".
tammers
4

Saya pikir <?=versi ini adalah praktik yang baik / dapat diterima, asalkan Anda hanya menggunakannya untuk hasil akhir variabel dan menghindari panggilan fungsi atau logika ternary yang tidak terkait langsung dengan penyajian data.

Ini tentu jauh lebih baik daripada di <? echo($x); ?>mana - mana.

Jangka panjang, Anda mungkin ingin melihat ke mesin templating seperti Smarty .

Darien
sumber
3
Smarty dulunya adalah mesin templat, tetapi saat ini merupakan mesin yang sudah usang & kembung, dan Anda harus benar-benar menghindari.
yannis
2

Pada PHP 7.4, lapangan bermain berubah sedikit:

<? ?> secara resmi tidak digunakan lagi dan akan dihapus dalam PHP 8.0.

PHP RFC: Turunkan PHP Tag terbuka pendek secara eksplisit menyatakan bahwa <?= ?>tidak terpengaruh. Ini akan menunjukkan (menurut saya, bukan RFC) bahwa penggunaannya tidak dianjurkan.

Etienne Bruines
sumber
-3

Sejujurnya, saya berpikir bahwa menggemakan hasil yang mana pun metodenya (mode lama atau baru) adalah sesuatu yang cukup usang sementara MVC merayakan 33 tahun sudah.

Saya akan mengatakan bahwa ya, ini adalah praktik yang baik untuk merangkum data server masuk (php) dalam dokumen XML dan memprosesnya di lapisan aplikasi / klien Anda, dengan demikian, menghemat Anda bahkan gagasan untuk menggunakan tag seperti itu.

sebas
sumber
1
Sebenarnya MVC merayakan 33 tahun, itu pertama kali digariskan pada Desember 1979 dalam tulisan ini .
yannis
ya, saya masih di tahun 2000, kesalahan saya :-)
sebas
1
um ... Templating ... apakah templating sudah usang? Apakah templating dan MVC saling eksklusif?
Tim Seguine