Saya terus membaca itu adalah praktik yang buruk untuk menggunakan tag penutup PHP ?>
di akhir file. Masalah header tampaknya tidak relevan dalam konteks berikut (dan ini adalah satu-satunya argumen yang bagus sejauh ini):
Versi modern dari PHP mengatur flag output_buffering di php.ini Jika output buffering diaktifkan, Anda dapat mengatur HTTP header dan cookie setelah mengeluarkan HTML karena kode yang dikembalikan tidak segera dikirim ke browser.
Setiap buku praktik dan wiki yang bagus dimulai dengan 'aturan' ini tetapi tidak ada yang menawarkan alasan yang bagus. Apakah ada alasan lain untuk melewatkan tag PHP penutup?
php
security
http-headers
danidacar
sumber
sumber
?>
malas?Jawaban:
Mengirim header lebih awal dari yang biasa mungkin memiliki konsekuensi yang jauh jangkauannya. Di bawah ini adalah beberapa di antaranya yang muncul di benak saya saat ini:
Sementara rilis PHP saat ini mungkin memiliki buffering output, server produksi aktual Anda akan menyebarkan kode Anda jauh lebih penting daripada mesin pengembangan atau pengujian. Dan mereka tidak selalu cenderung mengikuti tren PHP terbaru dengan segera.
Anda mungkin mengalami sakit kepala karena kehilangan fungsionalitas yang tidak dapat dijelaskan . Katakanlah, Anda menerapkan semacam gateway pembayaran, dan mengarahkan pengguna ke URL tertentu setelah konfirmasi berhasil oleh prosesor pembayaran. Jika beberapa jenis kesalahan PHP, bahkan peringatan, atau kelebihan garis berakhir terjadi, pembayaran mungkin tetap tidak diproses dan pengguna mungkin masih tampak tidak ditagih. Ini juga salah satu alasan mengapa redirection yang tidak perlu itu jahat dan jika redirection akan digunakan, itu harus digunakan dengan hati-hati.
Anda mungkin mendapatkan jenis kesalahan "Memuat halaman dibatalkan" di Internet Explorer, bahkan di versi terbaru. Ini karena respons AJAX / json include berisi sesuatu yang seharusnya tidak dikandungnya, karena kelebihan garis berakhiran pada beberapa file PHP, sama seperti yang saya temui beberapa hari yang lalu.
Jika Anda memiliki beberapa unduhan file di aplikasi Anda, mereka juga dapat rusak, karena ini. Dan Anda mungkin tidak menyadarinya, bahkan setelah bertahun-tahun, karena kebiasaan khusus untuk mengunduh tergantung pada server, browser, jenis dan isi file (dan mungkin beberapa faktor lain yang tidak ingin membuat Anda bosan) .
Akhirnya, banyak kerangka kerja PHP termasuk Symfony , Zend dan Laravel (tidak disebutkan tentang ini dalam pedoman pengkodean tetapi mengikuti yang sesuai) dan standar PSR-2 (item 2.2) membutuhkan penghilangan tag penutup. Manual PHP itu sendiri ( 1 , 2 ), Wordpress , Drupal dan banyak perangkat lunak PHP lainnya saya kira, menyarankan untuk melakukannya. Jika Anda hanya membiasakan mengikuti standar (dan mengatur PHP-CS-Fixer untuk kode Anda), Anda bisa melupakan masalah ini. Kalau tidak, Anda akan selalu perlu menyimpan masalah dalam pikiran Anda.
Bonus: beberapa gotcha (sebenarnya saat ini satu) terkait dengan 2 karakter ini:
?>
. Contohnya adalah Smarty, bahkan versi terbaru dari cabang 2. * dan 3. * memilikinya. Jadi, seperti biasa, perhatikan kode pihak ketiga . Bonus dalam bonus: Regex untuk menghapus akhir PHP yang tidak perlu: ganti(\s*\?>\s*)$
dengan teks kosong di semua file yang berisi kode PHP.sumber
\?>(?s:.){0,10}\Z
Penjelasan singkat: changeset.hr/blog/miscellaneous/catch-near-eof-with-regex?>
: misalnya cocok -dan akan dihapus-?> Hello
di<?php echo "test"; ?> Hello
. Kami ingin menghapus hanya tag penutup.[core:notice] [pid 7842] AH00052: child pid 10218 exit signal Segmentation fault (11)
.?>
, yang (sama seperti output apa pun) menyebabkan header dikirim segera setelah hasilnya. Tidak ada "header HTML" (selain<header>
tag HTML5 yang tidak terkait ).Alasan Anda harus meninggalkan tag penutup php (
?>
) adalah agar programmer tidak sengaja mengirim karakter baris baru tambahan.Alasan Anda tidak boleh meninggalkan tag penutup php adalah karena hal itu menyebabkan ketidakseimbangan dalam tag php dan setiap programmer dengan pikiran setengah ingat untuk tidak menambahkan ruang putih tambahan.
Jadi untuk pertanyaan Anda:
Tidak, tidak ada alasan bagus untuk melewatkan tag php penutup.
Saya akan menyelesaikan dengan beberapa argumen untuk tidak repot dengan tag penutup:
Orang selalu dapat membuat kesalahan, tidak peduli seberapa pintar mereka. Mengikuti praktik yang mengurangi jumlah kemungkinan kesalahan adalah (IMHO) ide yang bagus.
PHP bukan XML. PHP tidak perlu mematuhi standar ketat XML agar ditulis dengan baik dan fungsional. Jika tag penutup yang hilang mengganggu Anda, Anda diizinkan untuk menggunakan tag penutup, itu bukan aturan baku.
sumber
Ini adalah rekomendasi gaya pengkodean pemula , bermaksud baik, dan disarankan oleh manual .
?>
Namun menjauhi memecahkan tetesan dari header umum sudah mengirim penyebab (output mentah, BOM , pemberitahuan, dll) dan masalah tindak lanjut mereka.PHP sebenarnya mengandung beberapa sihir untuk memakan satu linebreak setelah
?>
token penutup. Meskipun memiliki masalah bersejarah , dan membuat pendatang baru masih rentan terhadap editor yang tidak stabil dan menyeret secara tidak sengaja di ruang putih lain setelahnya?>
.Secara gaya, beberapa pengembang lebih suka melihat
<?php
dan?>
sebagai tag SGML / instruksi pemrosesan XML, menyiratkan konsistensi keseimbangan dari token close trailing. (Yang mana, berguna untuk dependensi-kelas penyertaan termasuk untuk menggantikan file-by-file yang tidak efisien.)Agak jarang pembukaan
<?php
ditandai sebagai PHP shebang (dan sepenuhnya layak per binfmt_misc ), dengan demikian memvalidasi redundansi dari tag penutup yang sesuai.Ada perbedaan yang jelas antara mandat panduan PHP sintaksis klasik
?>\n
dan yang lebih baru (PSR-2) menyetujui penghilangan.(Sebagai catatan: Zend Framework mendalilkan satu di atas yang lain tidak menyiratkan superioritas yang melekat. Ini adalah kesalahpahaman bahwa para ahli tertarik dengan / menargetkan audiens API yang sulit).
SCM dan IDE modern menyediakan solusi bawaan yang sebagian besar mengurangi pemeliharaan tag dekat.
Mencegah penggunaan
?>
tag penutup hanya menunda menjelaskan perilaku pemrosesan PHP dasar dan semantik bahasa untuk menghindari masalah yang jarang terjadi. Masih praktis untuk pengembangan perangkat lunak kolaboratif karena variasi kecakapan peserta.Tutup variasi tag
The reguler ?> tag dekat juga dikenal sebagai
T_CLOSE_TAG
, atau dengan demikian "dekat tanda".Ini terdiri dari beberapa inkarnasi lagi, karena makan PHP newline ajaib :
?>\n (Unix linefeed)
?>\r (Pengembalian kereta, MAC klasik)
?>\r\n (CR / LF, di DOS / Menang)
Namun PHP tidak mendukung kombinasi baris Unicode NEL(U + 0085).
Versi PHP awal memiliki kompilasi-ins yang membatasi platform-agnostisisme IIRC (FI bahkan hanya digunakan
>
sebagai penanda dekat), yang kemungkinan merupakan asal historis penghindaran close-tag.Sering diabaikan, tetapi sampai PHP7 menghapus mereka , biasa
<?php
tanda pembukaan dapat secara sah dipasangkan dengan jarang digunakan</script>
sebagai tanda penutupan aneh ." Hard close tag " bahkan bukan satu - hanya membuat istilah itu untuk analogi. Namun secara konseptual dan penggunaan
__halt_compiler
harus diakui sebagai token dekat.Yang pada dasarnya memiliki tokenizer, buang semua kode atau bagian HTML biasa sesudahnya. Khususnya PHAR bertopik memanfaatkan itu, atau kombinasi yang berlebihan dengan
?>
seperti yang digambarkan.Demikian juga void yang
return;
jarang menggantikan dalam skrip include, menjadikannya?>
dengan trailing spasi kosong tidak efektif.Lalu ada semua jenis variasi tag penutup lunak / palsu ; kurang dikenal dan jarang digunakan, tetapi biasanya per token komentar :
Spasi sederhana
// ? >
untuk menghindari deteksi oleh tokenizer PHP.Atau pengganti Unicode yang mewah
// ﹖﹥
(U + FE56 MARK PERTANYAAN KECIL, U + FE65 BRACKET KECIL KECIL) yang dapat dipahami oleh regexp.Keduanya tidak berarti apa-apa untuk PHP , tetapi dapat memiliki kegunaan praktis untuk toolkit eksternal yang tidak sadar PHP atau semi-aware.
cat
Skrip-skrip yang bergabung lagi muncul di benak, dengan hasil// ? > <?php
gabungan yang sejalan-mempertahankan bagian sebelumnya file.Jadi ada alternatif tergantung konteks tapi praktis untuk penghilangan tag penutup imperatif.
Penjagaan
?>
tag dekat secara manual juga tidak terlalu kontemporer. Selalu ada alat otomatisasi untuk itu (bahkan jika hanya sed / awk atau regex-oneliners). Khususnya:Yang umumnya dapat digunakan untuk
--unclose
tag php untuk kode pihak ketiga, atau lebih tepatnya hanya memperbaiki (dan semua) masalah whitespace / BOM aktual:phptags --warn --whitespace *.php
Ini juga menangani
--long
konversi tag dll. Untuk kompatibilitas runtime / konfigurasi.sumber
<?php if($var): ?>Hello World<?php endif; ?>
??? Saya benar-benar ingin tahu karena tidak disebutkan secara spesifik.Itu bukan tag ...
Tetapi jika Anda memilikinya, Anda berisiko memiliki ruang putih setelahnya.
Jika kemudian Anda menggunakannya sebagai termasuk di bagian atas dokumen, Anda bisa memasukkan ruang kosong (yaitu konten) sebelum Anda mencoba mengirim header HTTP ... yang tidak diizinkan.
sumber
<?php $i = 1; ?>
lalu file2.php:<?php include 'file1.php'; header('Location: http://www.google.com');?>
phpcs
untuk memastikan bahwa tag penutup dibiarkan setiap satu file saya dan kemudian saya tidak khawatir tentang buffering output :)Sangat berguna untuk tidak membiarkan penutupan
?>
.File tetap valid untuk PHP (bukan kesalahan sintaksis) dan seperti @David Dorward mengatakan itu memungkinkan untuk menghindari memiliki spasi putih / break-line (apa pun yang dapat mengirim header ke browser) setelah
?>
.Sebagai contoh,
tidak akan valid
Tapi
akan.
Untuk sekali ini, Anda harus malas untuk merasa aman .
sumber
?>
. secure mungkin bukan kata yang baik di sini. Lagi pula, itu tidak memperbaiki apa-apa (itu bukan kode buruk bagi saya untuk mencegah hal-hal, diecho
sini akan menjadi kode yang buruk) tapi / dan itu masih valid. Buktikan saya salah tentang ini.?>
di akhir file php saja. tetapi apakah Anda pernah memiliki kebutuhan untuk men-debug beberapa kesalahan yang disebabkan oleh spasi tambahan? Juga tidak semua server dikonfigurasi dengan cara yang sama terutama ketika Anda pindah ke host lain, mengetahui bahwa kesalahan sangat memakan waktu. Jika Anda ingin menempatkan?>
lakukan saja, jika Anda juga menambahkan beberapa ruang tambahan dan tim Anda perlu men-debug yang siap menyalahkan git ^^Menurut dokumen , lebih baik menghilangkan tag penutup jika ada di akhir file karena alasan berikut:
Manual PHP> Referensi Bahasa> Sintaks dasar> Tag PHP
sumber
Yah, saya tahu alasannya, tetapi saya tidak bisa menunjukkannya:
Sumber: http://framework.zend.com/manual/en/coding-standard.php-file-formatting.html
sumber
Ya, ada dua cara untuk melihatnya.
.php
ekstensi tidak lebih dari file XML yang kebetulan diuraikan untuk kode PHP..php
ekstensi MUNGKIN menjadi file XML yang valid, tetapi tidak perlu.Jika Anda meyakini rute pertama, maka semua file PHP memerlukan tag penutup penutup. Untuk menghilangkannya akan membuat file XML tidak valid. Kemudian lagi, tanpa memiliki
<?xml version="1.0" charset="latin-1" ?>
deklarasi pembukaan , Anda tidak akan memiliki file XML yang valid ... Jadi itu bukan masalah besar ...Jika Anda yakin dengan rute kedua, itu membuka pintu untuk dua jenis
.php
file:Berdasarkan itu, file hanya kode OK untuk mengakhiri tanpa
?>
tag penutup . Tetapi file kode XML tidak boleh berakhir tanpa penutup?>
karena itu akan membatalkan XML.Tapi saya tahu apa yang Anda pikirkan. Anda berpikir apa bedanya, Anda tidak akan pernah merender file PHP secara langsung, jadi siapa yang peduli apakah itu XML yang valid. Ya, tidak masalah jika Anda mendesain templat. Jika itu XML / HTML yang valid, peramban normal tidak akan menampilkan kode PHP (diperlakukan seperti komentar). Jadi Anda dapat mengejek templat tanpa perlu menjalankan kode PHP dalam ...
Saya tidak mengatakan ini penting. Itu hanya pandangan yang tidak terlalu sering saya ungkapkan, jadi tempat apa yang lebih baik untuk membagikannya ...
Secara pribadi, saya tidak menutup tag dalam file perpustakaan, tetapi lakukan dalam file template ... Saya pikir itu adalah preferensi pribadi (dan pedoman pengkodean) berdasarkan lebih dari apa pun yang sulit ...
sumber
Selain semua yang telah dikatakan, saya akan memberikan alasan lain yang sangat menyebalkan bagi kami untuk melakukan debug.
Apache 2.4.6 dengan PHP 5.4 sebenarnya kesalahan segmentasi pada mesin produksi kami ketika ada ruang kosong di belakang
php
tag penutup . Saya hanya membuang-buang waktu sampai saya akhirnya mempersempit bug dengan strace .Berikut adalah kesalahan yang dilemparkan Apache:
sumber
"Apakah ada alasan bagus lainnya (selain masalah header) untuk melewatkan tag php penutup?"
Anda tidak ingin secara tidak sengaja menampilkan karakter whitepace yang asing ketika menghasilkan keluaran biner, data CSV , atau keluaran non-HTML lainnya.
sumber
Pro
Cons
Kesimpulan
Saya akan mengatakan bahwa argumen yang mendukung menghilangkan tag terlihat lebih kuat (membantu menghindari sakit kepala besar dengan header () + ini adalah PHP / Zend "rekomendasi"). Saya akui bahwa ini bukan solusi paling "indah" yang pernah saya lihat dalam hal konsistensi sintaksis, tetapi apa yang bisa lebih baik?
sumber
Karena pertanyaan saya ditandai sebagai duplikat dari pertanyaan ini, saya pikir tidak masalah untuk memposting mengapa TIDAK menghilangkan tag penutup
?>
karena beberapa alasan yang diinginkan.<?php ... ?>
) Sumber PHP adalah dokumen SGML yang valid, yang dapat diuraikan dan diproses tanpa masalah dengan pengurai SGML. Dengan batasan tambahan, itu juga bisa menjadi XML / XHTML yang valid.Tidak ada yang mencegah Anda menulis kode XML / HTML / SGML yang valid. Dokumentasi PHP mengetahui hal ini. Kutipan:
Tentu saja sintaks PHP tidak ketat SGML / XML / HTML dan Anda membuat dokumen, yang bukan SGML / XML / HTML, sama seperti Anda dapat mengubah HTML menjadi XHTML menjadi XML compliant atau tidak.
Pada titik tertentu Anda mungkin ingin menggabungkan sumber. Ini tidak akan semudah melakukan hanya
cat source1.php source2.php
jika Anda memiliki inkonsistensi yang diperkenalkan dengan menghilangkan?>
tag penutup .Tanpa
?>
lebih sulit untuk mengetahui apakah dokumen dibiarkan dalam mode pelarian PHP atau mode abaikan PHP (tag PI<?php
mungkin telah dibuka atau tidak). Hidup lebih mudah jika Anda secara konsisten meninggalkan dokumen dalam mode diabaikan PHP. Ini seperti bekerja dengan dokumen HTML yang diformat dengan baik dibandingkan dengan dokumen dengan tag yang tidak tertutup, bersarang buruk dll.Tampaknya beberapa editor seperti Dreamweaver mungkin memiliki masalah dengan PI dibiarkan terbuka [1] .
sumber
Jika saya memahami pertanyaan dengan benar, itu ada hubungannya dengan buffering output dan pengaruhnya pada tag penutup / penutup. Saya tidak yakin itu adalah pertanyaan yang sepenuhnya valid. Masalahnya adalah bahwa buffer output tidak berarti semua konten disimpan dalam memori sebelum mengirimkannya ke klien. Itu berarti beberapa konten.
Pemrogram dapat dengan sengaja menyiram buffer, atau buffer output, jadi apakah opsi buffer output dalam PHP benar-benar mengubah bagaimana tag penutup mempengaruhi pengkodean? Saya berpendapat bahwa itu tidak benar.
Dan mungkin itu sebabnya sebagian besar jawaban kembali ke gaya pribadi dan sintaksis.
sumber
Ada 2 kemungkinan penggunaan kode php:
dalam kasus 1. tag penutup benar-benar tidak berguna, juga saya ingin melihat hanya 1 (satu) tag buka php dan TIDAK (nol) tag penutup dalam kasus seperti itu. Ini adalah praktik yang baik karena membuat kode bersih dan memisahkan logika dari presentasi. Untuk kasus presentasi (2.) beberapa menemukan itu wajar untuk menutup semua tag (bahkan yang diproses PHP), yang mengarah ke confution, karena PHP sebenarnya memiliki 2 use case terpisah, yang tidak boleh dicampur: logika / kalkulus dan presentasi
sumber