Mana yang lebih baik: memasukkan HTML ke dalam kode PHP atau di luarnya?

28

Lihat ini:

<?php
echo "Hello World";
?>
<br />
<?php
echo "Welcome";
?>

Dan sekarang lihat ini:

<?php
echo "Hello World";
echo "<br />";
echo "Welcome";
?>

Manakah dari contoh di atas yang dianggap lebih baik (setidaknya dari sudut pandang kinerja)?

Saya tahu contohnya sepele tetapi saya ingin mengikuti kebiasaan latihan yang baik sejak awal sehingga ketika saya memiliki lebih banyak garis dan tidak akan mempengaruhi kinerja atau apa pun dengan cara negatif.

gegabah
sumber
14
Ini tampaknya tidak populer di PHP, tetapi perhatikan bahwa di ekosistem lain, keduanya dianggap buruk dan alternatif yang tepat adalah membuat templat semua bagian statis dengan logika minimal untuk memasukkan bagian dinamis, dan kemudian merendernya dari bahasa pemrograman.
1
@delnan - Anda harus mempertimbangkan memposting itu sebagai jawaban, dalam bentuk yang sedikit diperluas. Itu jauh lebih bersih.
jmort253
@ jmort253 Sudah mempertimbangkannya, tetapi saya memiliki sedikit pengetahuan PHP, jadi saya tidak bisa berbicara untuk praktik terbaik di dunia PHP.
Masalah apa yang sedang ingin kamu selesaikan?
Jim G.
Dalam hal kinerja tidak masalah. Jaringannya jauh lebih lambat dibandingkan. Biaya transfer secara signifikan lebih tinggi sehingga membuat biaya pembangkitan tidak signifikan dibandingkan.
Martin York

Jawaban:

23

Seperti komentar menunjukkan, itu harus dilakukan oleh templat. Tetapi jika hanya dua pilihan Anda yang memungkinkan. Kasus 1 akan lebih baik. Ini adalah konsep yang sama dengan layout menggembungkan android oleh xml, atau secara terprogram membuat UI. Anda <br/>adalah konten statis dari html Anda dan semua server Anda akan lakukan untuk menunjukkannya. Tetapi jika Anda menggunakan php, untuk menjalankannya, ini akan menggunakan sumber daya server Anda dan menjadi komputasi.

Inilah yang harus dilakukan: index.php:

<?php
include 'header.html';
...
include 'footer.html';  
?>  

header.html dan footer.html adalah templat.

wtsang02
sumber
1
Saya telah membaca buku untuk Kevin Yank yang merupakan "PHP & MySQL Novice to Ninja" tentang sesuatu yang disebut Controllers and templates. Apakah ini hal yang sama yang Anda ceritakan atau berbeda? jika mereka sama bagaimana menempatkan kode dalam file yang berbeda akan membuatnya lebih baik?
Ruam
Templat membuat situs web atau aplikasi Anda lebih mudah diprediksi. Apakah Anda melihat bagaimana header dan footer atau bahkan postingan StackOverflow sama? Mereka menggunakan template yang sama dan mengisinya dengan data dinamis.
wtsang02
Apa alasan utama di balik itu? Bagaimana jika kita tidak melakukannya dengan cara itu? apa yang akan kita kehilangan?
Ruam
Mari kita lihat ini. Ini adalah komentar ke 4 dari posting jawaban ini. Jika Anda melihat halaman ini pada sumber sekarang, Anda akan melihat "<div> <span ...> ... </span> <a ...> ... </a>" Gambar tangan mengkodekan komentar ke-4000. Apakah itu mungkin? atau hanya menjadikan ini sebagai templat dan minta server Anda 'menambahkan' ini saat dibutuhkan.
wtsang02
1
Juga @wtsang, Anda tidak hanya memiliki dua pilihan itu, Anda selalu memiliki yang ketiga, jalankan (atau belajar.)
ocodo
54

Untuk langsung menjawab pertanyaan Anda: Jangan gema teks statis atau HTML. Biarkan itu di luar PHP Anda.

<?php echo "<p>Hello World</p>"; // Alway wrong. ?>

<p>Hello World</p>  <!-- Does the same thing, faster, and is more readable. -->

Melarikan diri ke PHP adalah pemborosan jika semua yang akan Anda lakukan adalah lulus dalam teks statis atau html statis. Semua kode di dalam <?php ?>dikirim ke PHP untuk ditafsirkan. Ini berarti situs web Anda lebih lambat dan Anda membuang-buang listrik jika Anda mengirimkan sejumlah besar teks statis ke PHP tanpa alasan. (Terkadang ada alasannya.)

Praktik terbaik adalah memiliki logika dan pekerjaan kasar di file tanpa HTML, hanya PHP.

Cara saya suka melakukan ini adalah dengan kerangka kerja MVC. Saya memiliki PHP murni dalam model dan pengontrol, dan campuran HTML dan PHP dalam tampilan. Anda tidak membutuhkan kerangka kerja MVC; Anda bisa menempelkan campuran HTML Anda di file templat, yang kemudian Anda sertakan dalam file PHP murni Anda.

Setelah Anda membuat variabel Anda (yang tidak menyertakan HTML) dibuat dalam file PHP murni, Anda bisa meneruskannya ke file dengan HTML Anda. Di sana, dan hanya di sana, apakah boleh mencampur HTML dan PHP. Tapi, dan ini penting tetapi, ketika bekerja dengan file yang memiliki HTML, pertahankan PHP seminimal mungkin.

Untungnya, PHP dilengkapi dengan alat yang ramah untuk membuat PHP lebih mudah dibaca ketika dicampur dengan html.

Sintaks Alternatif

Praktik terbaik adalah dengan menggunakan sintaks PHP biasa ketika menulis PHP murni, tetapi sintaks alternatif, saat mencampur PHP dan HTML.

Dalam file PHP biasa tanpa HTML apa pun:

if ($something) {
  do_something(); // do_something() shouldn't echo or print.
}

Ini indah untuk PHP murni, tetapi tidak ideal saat melarikan diri dari HTML. Secara khusus, kurung kurawal sering sulit dipahami ketika muncul dalam tumpukan besar HTML.

Tampaknya, berdasarkan pertanyaan Anda yang akan Anda tulis, dalam file yang mencampur HTML dan PHP, ini:

<?php
  if ($something) {
    echo '<p>Hello World.</p>';
  }
?>

Untuk alasan yang dijelaskan di atas, kami ingin agar HTML tidak dikirim ke PHP. Kami melakukan ini seperti ini:

<?php if ($something) { ?>
  <p>Hello World.</p>
<?php } ?>

Kami mengeluarkan HTML dari tag PHP kami, yang merupakan peningkatan. Tapi kita bisa melangkah lebih jauh.

Perhatikan betapa tidak informatif penahan penutupan itu? Kami tidak tahu apakah itu menutup loop atau pernyataan if. Ini tampaknya sepele dalam contoh di atas, tetapi sering ada puluhan baris HTML di dalam if / endif di dalam loop / endloop.

Praktik terbaik adalah bahwa dalam file yang mencampur PHP dan HTML, Anda menggunakan sintaks alternatif, yang menghilangkan kawat pembuka dan penutup ( { }):

<?php if ($something): ?>
  <p>Hello world.</p>
<?php endif; ?>

Selain dari semantik sintaks baru ( :dan endif;bukannya {dan }), Anda harus memperhatikan dua hal:

  1. Sekali lagi, HTML dan teks, sementara dikendalikan oleh PHP, berada di luar <?php ?>tag, sehingga tidak ditafsirkan. Untuk alasan yang dijelaskan di atas, ini bagus.
  2. Ini jauh lebih informatif daripada jika ini semua php termasuk kurung kurawal penutupan acak ( <?php } ?>) menutup hal-hal yang sulit untuk menemukan di mana mereka membuka (karena mereka dicampur dengan buch HTML yang tampak berantakan). Sekali lagi, bayangkan file HTML besar dengan loop dan pernyataan if. Menentukan apa yang Anda tutup dapat mengklarifikasi banyak.

Sintaks ramah template yang sama dapat digunakan untuk loop juga:

<?php foreach ($things as $thing): ?>
  <li><?php echo $thing; ?></li>
<?php endforeach; ?>

Tag Pendek

Alat hebat lain yang disediakan oleh PHP yang, sekali lagi, Anda hanya ingin menggunakan saat menggabungkan PHP dan HTML bersama-sama, adalah tag pendek. Anda mungkin harus mengaktifkan tag pendek di file php.ini. Setelah diaktifkan, tag pendek membuat segalanya lebih mudah dibaca.

Tanpa tag pendek, Anda harus menulis <?php echo $something; ?>tetapi dengan tag pendek Anda dapat menulis <?=$something?>dan itu akan memiliki hasil yang sama persis.

Saat menggabungkan tag pendek dan sintaks PHP alternatif, Anda dapat benar-benar menulis beberapa file HTML yang elegan, yang mencakup elemen PHP. Mengambil contoh loop terakhir kami (hanya bagian di dalam loop), tag pendek memungkinkan kami mengurangi:

<li><?php echo $thing; ?></li>

untuk

<li><?=$thing?></li>

yang jauh lebih mudah dibaca.

Bisakah kita melangkah lebih jauh? Iya nih. Menggunakan berbagai sistem templating Anda dapat melakukan hal-hal seperti:

<li>{thing}</li>

Yang luar biasa bisa dibaca. Sistem templating, bagaimanapun, adalah jauh di luar ruang lingkup dari pertanyaan aslinya (yang saya tinggalkan beberapa waktu yang lalu).

Ted
sumber
4
+1 Karena menjadi saran yang baik untuk semua orang. Sintaks kontrol alternatif dan tag pendek sangat penting untuk memulai dengan template dan pemisahan logika dari presentasi.
Will Meldon
1
Tag pendek harus digunakan dengan hati-hati. Jika Anda membuat kode yang akan digunakan kembali, Anda tidak dapat menjamin bahwa short_open_tagarahan akan selalu dihidupkan. PHP 5.4 menyediakan <?=$thing?>semua waktu, bahkan ketika short_open_tagdinonaktifkan. Juga, short_open_tagdinonaktifkan untuk mencegah konflik dengan XML.
Chris
3
+1 untuk menunjukkan berbagai alternatif, maju ke jawaban terbaik.
Tola Odejayi
1
Mungkin dulu benar, tapi saya baru memeriksa opcodes (yaitu apa yang sebenarnya dijalankan oleh mesin) di PHP7, dan pencampuran PHP / HTML tentu tidak "menghemat listrik" dengan menghindari melewati teks statis. <?php $foo='ABC'; echo '<div>', $foo, '</div>'dan <?php $foo='ABC'; ?><div><?=$foo?></div>menghasilkan opcode yang sama persis, yaitu mereka identik.
Josh dari Qaribou
Pada catatan tentang sistem templating, pendekatan templating paling sederhana yang akan memungkinkan untuk contoh Anda adalah heredoc sederhana. Heredoc memungkinkan Anda mengatakan <li>{$thing}</li>seperti yang Anda tunjukkan, dengan keunggulan dibandingkan tanda kutip ganda yang tidak harus Anda lepaskan dari tanda kutip ganda di dalamnya. Anda juga dapat menetapkan heredoc atau meneruskannya ke fungsi, jadi jauh lebih bersih daripada php / html jika Anda menggunakannya dalam blok, misalnya. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Josh dari Qaribou
4

Anda sedang belajar, lupakan kinerja di halaman PHP. Sebaliknya, pilih cara yang paling mudah dibaca .

Melihat dua contoh Anda yang kedua adalah yang paling mudah dibaca, meskipun saya pikir itu karena jarak yang Anda gunakan. Anda mengatakan Anda ingin mengembangkan kebiasaan yang baik sejak awal, saya pikir waktu Anda dapat dihabiskan lebih baik dengan membuat kode Anda dibaca dengan baik. Ini mungkin berarti menulis ulang suatu bagian beberapa kali sampai Anda puas.

Jika Anda benar-benar tertarik di belakang layar, saya akan menjelaskan apa yang terjadi dengan konten statis di halaman PHP. Salah satu hal pertama adalah "mem-parsing" seluruh halaman menjadi kode yang dapat dieksekusi (seperti yang Anda lihat di antara <?php ?>tag). Salah satu bagian dari ini adalah mengubah teks statis apa pun menjadi echo.

Jadi ini:

<?php echo "Hello World"; ?>
<br />
<?php echo "Welcome"; ?>

ditransformasikan menjadi sesuatu seperti:

echo "Hello World";
echo "<br />";
echo "Welcome";

Ada biaya yang sangat kecil terkait dengan penguraian, tetapi tidak ada perbedaan dalam mengeksekusi kode yang dihasilkan. Jika Anda menggunakan akselerator PHP, penguraian hanya dilakukan sekali dan kemudian di-cache, sehingga Anda tidak akan melihat perbedaan kinerja setelah pemuatan halaman pertama.

Ingat: mudah dibaca!

Selamat
sumber
1
Saya Tidak Setuju. Ini bukan hanya tentang kinerja, itu sebenarnya tentang belajar. Bukan saran yang baik untuk mempelajari praktik yang salah.
Isaac
Tidak benar bahwa "teks statis" diubah menjadi echo, jika Anda maksudkan secara harfiah (yang disiratkan oleh bahasa Anda). Hasilnya sama, tetapi metodenya sangat berbeda. Apa yang Anda sebut "teks statis" sebenarnya melarikan diri dari PHP ke HTML. Ketika ini terjadi, server mulai mengirimkan teks mentah. Itu tidak menguraikannya melalui PHP, seperti halnya dengan echo. Implikasi kinerja mungkin kecil dalam keadaan apa pun yang tidak dibuat-buat, tetapi perbedaan mekanistik penting.
underscore_d
0

Salah satu fitur terbaik PHP adalah ia dirancang untuk tertanam dalam HTML. Biasanya digunakan dalam membuat template. Itu membuat kode Anda lebih mudah dibaca dan dipelihara, karena memisahkan kode PHP dari HTML.

Tetapi jika Anda hanya mencetak halaman statis seperti "Hello World!" itu ide yang buruk.

4kaya
sumber
0

Untuk menjawab pertanyaan Anda secara sederhana: diberikan kode contoh Anda, akan ada sedikit perbedaan jika ada dalam kinerja. PHP diproses di tingkat server / host sedangkan HTML diproses oleh agen pengguna / orang yang melihat halaman web Anda di browser mereka. Siapa yang akan lebih cepat? Sulit ditentukan.

Saya setuju dengan yang lain mengatakan masing-masing memiliki kekuatan dan kelemahan mereka dan dapat bekerja dengan sangat baik bersama. PHP dapat diprogram dan dapat melakukan perhitungan dan bekerja dengan variabel. Karena itu semua halaman saya akhirnya menjadi PHP dan memanggil potongan kode HTML - template seperti yang disebutkan dan memasukkan variabel sehingga HTML saya menjadi dinamis.

Dalam contoh Anda, Anda dapat merangkai HTML menjadi satu pernyataan PHP seperti:

    <?php echo "Hello World<br>Welcome"; ?>

Semoga itu sedikit membantu memperjelas.

Michael Moriarty
sumber
0

ada batasan dalam menggunakan HTML dalam PHP.

Sebagian besar waktu Anda memiliki HTML di luar. Anda akan membuat halaman seperti yang Anda lakukan jika Anda tidak menggunakan PHP, lalu tambahkan PHP ke dalam area dokumen di mana Anda membutuhkannya. Anda dapat memiliki beberapa potongan PHP di dalam dokumen.

Bekerja dengan PHP Inside HTML memiliki beberapa contoh:

https://www.thoughtco.com/php-with-html-2693952

Purvi Barot
sumber
-1

Biasanya dianggap bentuk buruk untuk mengeluarkan kode HTML dari PHP. Ada beberapa alasan untuk ini, tetapi yang utama adalah lebih mudah, terutama dalam jangka panjang, untuk mempertahankan kode jika HTML dan kode PHP dipisahkan.

Sama seperti HTML, CSS, dan Javascript; jauh lebih mudah dan lebih praktis untuk memisahkannya.

Secara teknis, bagaimanapun, tidak ada bedanya bagaimana Anda menghasilkan barang. Untuk PHP itu hanya byte dalam satu baris.

Sverri M. Olsen
sumber
6
Itu membuat perbedaan. <?php echo 'hello'; ?>diteruskan ke PHP. hellotidak diteruskan ke PHP. Apa pun yang diteruskan ke PHP akan dikonversi ke bytecode kemudian ditafsirkan. Ini membutuhkan waktu, daya pemrosesan, dan listrik.
Ted