Hangisi daha iyi: HTML'yi PHP kodunun içine veya dışına eklemek?


28

Şuna bak:

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

Şimdi şuna bak:

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

Yukarıdaki örneklerden hangisinin daha iyi olduğu kabul edilir (en azından performans açısından)?

Örneklerin önemsiz olduğunu biliyorum ama başlangıçtan itibaren iyi uygulama alışkanlıklarını takip etmek istiyorum, böylece gittikçe daha fazla çizgime sahip olduğumda performansı ya da olumsuz şekilde etkilemeyeceklerini söylediler.


14
Bu PHP'de çok popüler görünmüyor, ancak diğer ekosistemlerde, her ikisinin de kötü olarak kabul edildiğini ve uygun alternatifin, dinamik parçaları içerecek şekilde minimum mantıkla tüm statik parçaların bir şablonunu oluşturmak olduğunu ve daha sonra bunları Programlama dili.

1
@delnan - Bunu bir cevap olarak, biraz genişletilmiş biçimde yayınlamayı düşünmelisiniz. Bu çok daha temiz.
jmort253

@ jmort253 Bunu düşündüm, fakat çok az PHP bilgim var, bu yüzden PHP dünyasındaki en iyi uygulamalar için konuşamadım.

Ne problemi çözmeye çalışıyorsun?
Jim G.

Performans açısından önemli değil. Ağ karşılaştırıldığında, çok daha yavaştır. Transfer maliyeti önemli ölçüde yüksektir, bu nedenle üretim maliyetini kıyaslandığında önemsiz kılar.
Martin York

Yanıtlar:


23

Yorumun işaret ettiği gibi, şablonlarla yapılmalıdır. Ancak, sadece iki seçiminiz mümkün ise. Durum 1 daha iyi olacak. Bu xml tarafından android şişirme düzeni ya da programlı bir şekilde UI yaparak aynı kavramdır. Sizin <br/>senin html ve sunucu yapacağız hepsini göstermektir gelen statik bir içeriğidir. Ancak, eğer çalıştırmak için php kullanıyorsanız, bu sunucu kaynaklarınızı kullanıyor ve bilgisayar kullanıyor olacak.

Bu nasıl yapılmalı: index.php:

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

header.html ve footer.html şablonlardır.


1
Kevin Yank için "PHP ve Ninja'ya Acemi MySQL Acemi" olan ve Denetleyiciler ve şablonlar hakkında bir kitap okudum. Bunlar bana bahsettiğinizle aynı mı, yoksa farklı mı? aynıysa, kodu farklı dosyalara koymak daha iyi performans göstermesini sağlayacak mı?
12'de

Şablonlar, web sitenizi veya uygulamanızı daha esnek hale getirir. StackOverflow başlıklarının, altbilgilerinin ve hatta yazılarının nasıl aynı olduğunu görüyor musunuz? Aynı şablonu kullanıyorlar ve dinamik verilerle dolduruyorlar.
wtsang02

Bunun arkasındaki ana sebep nedir? Ya bu şekilde yapmazsak? ne kaybedeceğiz?
12'de 2

Şuna bir bakalım. Bu cevap yazısının dördüncü yorumu. Bu sayfayı şimdi kaynakta görüntülüyorsanız, "<div> <span ...> ... </span> <a ...> ... </a>" 4000. yorumu kodlayan Görüntüleme elini göreceksiniz. Mümkün mü? veya bunu şablon olarak yapın ve gerektiğinde sunucunuzun bunu eklemesini sağlayın.
wtsang02

1
Ayrıca @ wtsang, asla bu iki seçeneğe sahip değilsin, her zaman üçüncü bir koşun (ya da öğren) var
ocodo

54

Sorunuzu doğrudan cevaplamak için: Asla statik metin veya HTML yazmayın. Bunu PHP'nizin dışında bırakın.

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

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

Yapmanız gereken tek şey statik metin veya statik html'den geçmekse, PHP'ye kaçmak bir israftır. İçindeki tüm kodlar <?php ?>yorumlanmak üzere PHP'ye gönderilir. Bu, web sitenizin daha yavaş olduğu ve PHP'ye sebepsiz yere çok miktarda statik metin ilettiğinizde elektrik harcadığınız anlamına gelir. (Bazen bir sebep vardır.)

En iyi uygulama, mantığınızın ve homurdanızın HTML içermeyen dosyalarda çalışmasını sağlamaktır, sadece PHP.

Bunu yapmayı sevdiğim yol bir MVC çerçevesi ile. Modeller ve denetleyicilerde saf PHP, görünümlerde ise HTML ve PHP karışımı var. Bir MVC çerçevesine ihtiyacınız yok; HTML karışımınızı şablon dosyalarına yapıştırabilir, daha sonra saf PHP dosyalarınızı eklersiniz.

Değişkenlerinizi (bunlara HTML içermeyen) salt PHP dosyalarında oluşturduktan sonra, HTML'nizle bunları dosyaya aktarabilirsiniz. Orada ve sadece orada, HTML ve PHP'yi karıştırmak iyi. Ancak, bu önemlidir ve HTML içeren dosyalarla çalışırken PHP'yi minimumda tutun.

Neyse ki, PHP, html ile karıştırıldığında PHP'nin okunmasını kolaylaştıran kolay araçlarla birlikte gelir.

Alternatif Sözdizimi

En iyi uygulama, saf PHP yazarken düzenli PHP sözdizimini kullanmak, fakat PHP ve HTML'yi karıştırırken alternatif sözdizimini kullanmaktır.

HTML'siz düzenli PHP dosyalarında:

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

Bu, saf PHP için güzeldir, ancak HTML'den kaçarken ideal değildir. Özellikle, kapanış ayraçları genellikle büyük HTML yığınlarında göründüklerinde anlaşılması güçtür.

Sorunuza dayanarak, HTML ve PHP'yi karıştıran bir dosyada yazmış olacağınız anlaşılıyor:

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

Yukarıda açıklanan nedenlerden dolayı, HTML’nin PHP’ye gönderilmemesini istiyoruz. Bunu böyle yaparız:

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

HTML kodumuzu PHP etiketlerimizden aldık, bu bir gelişmedir. Ama daha ileri gidebiliriz.

Kapama ayracının ne kadar verimsiz olduğuna dikkat edin. Bir döngü mü yoksa bir if ifadesi mi kapattığını bilmiyoruz. Bu, yukarıdaki örnekte önemsiz görünmektedir, ancak genellikle bir döngü / endloop içindeki if / endif'in içinde düzinelerce HTML satırı vardır.

En iyi uygulama, PHP ve HTML'yi karıştıran bir dosyada, ayraçları ( { }) açıp kapatmayı ihmal eden alternatif sözdizimini kullanmaktır :

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

Yeni sözdiziminin anlambiliminin dışında ( :ve endif;yerine {ve }) iki şeyi fark etmelisiniz:

  1. Yine, HTML ve metin, PHP tarafından kontrol edilirken, <?php ?>etiketlerin dışındadır , dolayısıyla yorumlanmaz. Yukarıda açıklanan nedenlerden dolayı, bu iyidir.
  2. Bu, tüm bunların php olmasının, rastgele kapanış parantezleri ( <?php } ?>) açtıkları yeri bulmakta zor olan şeyleri kapatmaları (çünkü, dağınık görünümlü bir HTML demetiyle karıştırılmaları) dahil olmaktan çok daha bilgilendiricidir . Yine, döngüler ve if ifadeleri ile büyük bir HTML dosyası hayal edin. Neyi kapattığınızı belirtmek çok netleşebilir.

Aynı şablon dostu sözdizimi döngüler için de kullanılabilir:

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

Kısa Etiketler

PHP tarafından sağlanan bir başka harika araç, yine de sadece PHP ve HTML'yi karıştırırken kullanmak istediğiniz kısa etiketlerdir. Kısa etiketleri php.ini dosyasında açmanız gerekebilir. Açıldıktan sonra kısa etiketler her şeyi daha okunaklı hale getirir.

Kısa etiketler olmadan yazmanız gerekir, <?php echo $something; ?>ancak kısa etiketler ile yazabilirsiniz <?=$something?>ve aynı sonucu verecektir.

Kısa etiketleri ve alternatif PHP sözdizimini birleştirirken, PHP öğelerini içeren bazı zarif HTML dosyalarını yazabilirsiniz. Son döngü örneğimizi alarak (sadece döngü içindeki kısım), kısa etiketler azaltmamızı sağlar:

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

için

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

bu çok daha okunaklı.

Daha ileri gidebilir miyiz? Evet. Çeşitli şablonlama sistemlerini kullanarak aşağıdakileri yapabilirsiniz:

<li>{thing}</li>

Hangi inanılmaz okunabilir. Bununla birlikte, şablonlama sistemleri, asıl sorunun kapsamı dışındadır (yine de bir süre önce bıraktım).


4
+1 Herkese iyi tavsiyeler vermek için. Alternatif kontrol sözdizimi ve kısa etiketler, şablonlara başlamak ve mantığın sunumdan ayrılması için son derece önemlidir.
Meldon Will

1
Kısa etiketler dikkatli kullanılmalıdır. Yeniden kullanılacak bir kod oluşturuyorsanız, short_open_tagyönergenin her zaman açık olacağını garanti edemezsiniz . PHP 5.4 , devre dışı bırakılmış <?=$thing?>olsa bile her zaman kullanılabilir duruma getirir short_open_tag. Ayrıca, short_open_tagXML ile çakışmaları önlemek için varsayılan olarak kapalıdır.
Chris

3
En iyi cevaba ilerleyerek, farklı alternatifleri göstermek için +1.
Tola Odejayi

1
Belki eskiden doğruydu, ancak PHP7'deki opcod'ları (yani aslında motor tarafından çalıştırılanları) kontrol ettim ve PHP / HTML'yi karıştırmak kesinlikle statik metin iletmekten kaçınarak "elektrik tasarrufu" yapmaz. <?php $foo='ABC'; echo '<div>', $foo, '</div>'ve <?php $foo='ABC'; ?><div><?=$foo?></div>tam olarak aynı opcodlarla sonuçlanır, yani bunlar aynıdır.
Qaribou'dan Josh

Şablonlama sistemleri hakkındaki notta, örneğinize izin verecek en basit şablonlama yaklaşımı basit bir ayırıcıdır. Heredoc <li>{$thing}</li>, gösterdiğiniz gibi söyleyebilmenizi sağlar , bunun içindeki çift tırnaktan kaçmak zorunda kalmayacağınız çift tırnak üzerindeki avantaj. Ayrıca heredoc atayabilir veya işlevlerine geçirebilirsiniz, bu yüzden eğer bloklar halinde kullanıyorsanız php / html çok daha temizdir. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Qaribou'dan Josh

4

Öğreniyorsun, PHP sayfalarındaki performansı unut. Bunun yerine, okunması en kolay yolu seçin .

İki örneğinize bakıldığında, ikincisi okumak için en kolay yol olsa da, bence kullandığınız boşluk yüzünden. En baştan iyi alışkanlıklar geliştirmek istediğinizi söylüyorsunuz, kodunuzun iyi okunmasıyla zamanınızın daha iyi geçebileceğini düşünüyorum. Bu, memnun kalana kadar bir bölümü birkaç kez yeniden yazmak anlamına gelebilir.

Sahnelerin gerisinde gerçekten istekliysen, bir PHP sayfasındaki statik içeriğin ne olduğunu açıklamaya devam edeceğim. İlk şeylerden biri, sayfanın tamamını çalıştırılabilir koda "ayrıştırmak" ( <?php ?>etiketler arasında gördüğünüz gibi ). Bunun bir kısmı herhangi bir statik metni bir echo.

Yani bu:

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

şöyle bir şeye dönüşür:

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

Ayrıştırma ile ilgili çok küçük bir maliyet var, ancak sonuçta ortaya çıkan kodun yürütülmesinde bir fark yok. Bir PHP hızlandırıcısı kullanıyorsanız, ayrıştırma yalnızca bir kez yapılır ve önbellekte saklanır, böylece ilk sayfa yüklenmesinden sonra performans farkı görmezsiniz.

Unutmayın: okunması kolay!


1
Katılmıyorum. Bu sadece performansla ilgili değil, aslında öğrenme ile ilgili. Yanlış bir uygulama öğrenmek iyi bir fikir değildir.
Isaac

echoKelimenin tam anlamıyla (demek istediğin anlamına gelir) demek istiyorsan, "statik metin" in "olduğu" doğru değildir . Sonuç aynı, ancak yöntemler çok farklı. "Statik metin" dediğiniz şey aslında PHP'den HTML'ye kaçmak. Bu olduğunda, sunucu ham metin göndermeye başlar. PHP ile olduğu gibi ayrıştırmaz echo. Performans etkileri, olası olmayan her durumda muhtemelen küçüktür, ancak mekanik fark önemlidir.
underscore_d

0

PHP'nin en iyi özelliklerinden biri, HTML'ye gömülecek şekilde tasarlanmış olmasıdır. Genellikle şablon oluşturmada kullanılır. PHP kodunuzu HTML'den ayırdığından kodunuzun okunmasını ve korunmasını kolaylaştırır.

Ancak, yalnızca "Merhaba Dünya!" Gibi statik bir sayfa yazdırıyorsanız Bu kötü bir fikir.


0

Sorunuza basitçe cevap vermek için: örnek kodunuz verildiğinde, performansta herhangi bir fark varsa, çok az olacaktır. PHP sunucu / ana bilgisayar düzeyinde işlenirken, HTML tarayıcıda web sayfanıza bakan kullanıcı aracısı / kişi tarafından işlenir. Kim daha hızlı olacak? Belirlemesi zor.

Diğerleriyle, her birinin güçlü ve zayıf yönleri olduğunu ve birlikte çok iyi çalışabileceğini söyleyerek katılıyorum. PHP programlanabilir ve hesaplamalar yapabilir ve değişkenlerle çalışabilir. Bu nedenle tüm sayfalarım PHP olur ve HTML kod parçacıklarını çağırır - bahsettiğim gibi şablonlar ve HTML'imin dinamik olması için değişkenler ekler.

Örnekte, HTML'yi aşağıdaki gibi bir PHP deyiminde bir araya getirebilirsiniz:

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

Umarım bu biraz netleşmeye yardımcı olur.


0

PHP içinde HTML kullanımında sınırlamalar vardır.

HTML'nizin çoğu dışarıda olmazdı. PHP kullanmıyorsanız yaptığınız gibi bir sayfa oluşturup, PHP'yi ihtiyaç duyduğunuz belgenin alanlarına ekleyin. Bir belge içinde birkaç parça PHP olabilir.

PHP ile Çalışmak HTML İçinde Bazı Örnekler:

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


-1

PHP'den HTML kodunu çıkarmak genellikle kötü bir form olarak kabul edilir. Bunun birkaç nedeni vardır, ancak bunlardan en önemlisi, özellikle uzun vadede, HTML ve PHP kodları ayrılırsa kodu korumanın daha kolay olmasıdır.

Aynı HTML, CSS ve Javascript gibi; ayrı tutmak çok daha kolay ve pratiktir.

Bununla birlikte, teknik olarak, malzemeleri nasıl çıktıracağınız kesinlikle farketmez . PHP için sadece üst üste bayt.


6
Bir fark yaratıyor. <?php echo 'hello'; ?>PHP'ye geçer. helloPHP'ye geçilmez. PHP'ye geçen her şey bytecode'a dönüştürülür ve ardından yorumlanır. Bu zaman alır, işlem gücü ve elektrik harcar.
Ted
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.