Co jest lepsze: dołączyć HTML do kodu PHP lub poza nim?


28

Spójrz na to:

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

A teraz spójrz na to:

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

Który z powyższych przykładów uważa się za lepszy (przynajmniej z punktu widzenia wydajności) ?.

Wiem, że przykłady są trywialne, ale od samego początku chcę przestrzegać dobrych praktyk, więc kiedy będę mieć coraz więcej linii, nie wpłyną one negatywnie na wydajność ani nic w tym rodzaju.


14
Nie wydaje się to być bardzo popularne w PHP, ale należy pamiętać, że w innych ekosystemach oba są uważane za złe, a właściwą alternatywą jest utworzenie szablonu wszystkich części statycznych z minimalną logiką, aby uwzględnić części dynamiczne, a następnie renderować je z język programowania.

1
@delnan - Powinieneś rozważyć opublikowanie tego jako odpowiedzi w nieco rozszerzonej formie. To jest o wiele czystsze.
jmort253

@ jmort253 Rozważyłem to, ale mam bardzo małą wiedzę na temat PHP, więc nie mogłem mówić o najlepszych praktykach w świecie PHP.

Jaki problem próbujesz rozwiązać?
Jim G.

Pod względem wydajności nie ma to znaczenia. Sieć jest o wiele wolniejsza w porównaniu. Koszt transferu jest znacznie wyższy, przez co koszt wytwarzania jest nieznaczny w porównaniu.
Martin York,

Odpowiedzi:


23

Jak zauważa komentarz, należy tego dokonać za pomocą szablonów. Ale jeśli tylko twój wybór jest możliwy. Przypadek 1 będzie lepszy. Jest to ta sama koncepcja, co w przypadku nadmuchiwania układu Androida przez XML lub programowego tworzenia interfejsu użytkownika. Twój <br/>jest statyczną zawartością z twojego html i wszystko co serwer będzie robił, to pokaże. Ale jeśli użyjesz php, aby go uruchomić, użyje zasobów twoich serwerów i będzie działał na komputerze.

Oto jak należy to zrobić: index.php:

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

header.html i footer.html to szablony.


1
Przeczytałem książkę dla Kevina Yanka, która jest „PHP i MySQL Novice to Ninja” o czymś zwanym Kontrolery i szablony. Czy to ta sama rzecz, o której mi mówiłeś, czy też są inne? jeśli są takie same, to jak umieszczenie kodu w różnych plikach poprawi jego działanie?
zgrzyt

Szablony sprawiają, że twoja strona internetowa lub aplikacja jest bardziej elastyczna. Czy widzisz, jak nagłówki i stopki, a nawet posty StackOverflow są takie same? Używają tego samego szablonu i wypełniają go dynamicznymi danymi.
wtsang02,

Jaki jest główny tego powód? Co jeśli nie zrobimy tego w ten sposób? co stracimy?
zgrzyt

Spójrzmy na to. To jest 4. komentarz do tego postu z odpowiedzią. Jeśli teraz przejrzysz tę stronę u źródła, zobaczysz „<div> <span ...> ... </span> <a ...> ... </a>” Obrazowanie koduje 4000. komentarz. Czy to jest możliwe? lub po prostu zrób to jako szablon i niech twój serwer „doda” to, kiedy będzie to potrzebne.
wtsang02,

1
Również @wtsang, nigdy nie masz tylko tych dwóch opcji, zawsze masz trzecią, biegnij (lub ucz się).
ocodo

54

Aby bezpośrednio odpowiedzieć na twoje pytanie: Nigdy nie odbijaj statycznego tekstu ani HTML. Pozostaw to poza swoim PHP.

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

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

Ucieczka do PHP jest marnotrawstwem, jeśli wszystko, co musisz zrobić, to przekazać statyczny tekst lub statyczny HTML. Cały kod <?php ?>jest wysyłany do PHP w celu interpretacji. Oznacza to, że twoja strona działa wolniej i marnujesz energię elektryczną, jeśli bez żadnego powodu przekazujesz do PHP duże ilości statycznego tekstu. (Czasami jest powód.)

Najlepszą praktyką jest logika i chrząkanie w plikach bez HTML, tylko PHP.

Lubię to robić z frameworkiem MVC. Mam czysty PHP w modelach i kontrolerach oraz mieszankę HTML i PHP w widokach. Nie potrzebujesz frameworka MVC; możesz po prostu umieścić swoją mieszankę HTML w plikach szablonów, które następnie dołączasz do czystych plików PHP.

Kiedy już utworzysz zmienne (które nie zawierają HTML) w czystych plikach PHP, możesz przekazać je do pliku za pomocą HTML. Tam i tylko tam można mieszać HTML i PHP. Ale to jest ważne, ale podczas pracy z plikami zawierającymi HTML, ogranicz PHP do minimum.

Na szczęście PHP zawiera przyjazne narzędzia, dzięki którym PHP jest łatwiejszy do odczytania po zmieszaniu z HTML.

Alternatywna składnia

Najlepszą praktyką jest używanie zwykłej składni PHP przy pisaniu czystego PHP, ale alternatywnej przy mieszaniu PHP i HTML.

W zwykłych plikach PHP bez HTML:

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

Jest to piękne dla czystego PHP, ale nie jest idealne, gdy uciekasz od HTML. W szczególności nawiasy zamykające są często trudne do zrozumienia, gdy pojawiają się w dużych stosach HTML.

Wydaje się, na podstawie twojego pytania, które napisałeś, w pliku mieszającym HTML i PHP, to:

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

Z powodów opisanych powyżej chcemy, aby HTML nie był wysyłany do PHP. Robimy to tak:

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

Wyciągnęliśmy HTML z naszych tagów PHP, co jest ulepszeniem. Ale możemy pójść dalej.

Zauważ, jak mało pouczający jest nawias zamykający? Nie wiemy, czy zamyka pętlę, czy instrukcję if. W powyższym przykładzie wydaje się to trywialne, ale w tekście if / endif wewnątrz pętli / endloopa często znajdują się dziesiątki linii HTML.

Najlepszą praktyką jest to, że w pliku mieszającym PHP i HTML używasz alternatywnej składni, która pomija otwieranie i zamykanie nawiasów klamrowych ( { }):

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

Oprócz semantyki nowej składni ( :i endif;zamiast {i }) powinieneś zauważyć dwie rzeczy:

  1. Znów HTML i tekst, chociaż kontrolowane przez PHP, znajdują się poza <?php ?>tagami, więc nie są interpretowane. Z powodów opisanych powyżej jest to dobre.
  2. Jest to o wiele bardziej pouczające niż gdyby były to wszystkie php, w tym losowe zamykanie nawiasów klamrowych ( <?php } ?>) zamykające rzeczy, które trudno znaleźć w miejscu, w którym się otworzyły (ponieważ są zmieszane z dużą ilością niechlujnie wyglądającego HTML). Ponownie wyobraź sobie duży plik HTML z pętlami i instrukcjami if. Określanie tego, co zamykasz, może wiele wyjaśnić.

Ta sama przyjazna dla szablonu składnia może być również używana w przypadku pętli:

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

Krótkie tagi

Innym świetnym narzędziem dostarczanym przez PHP, którego znowu chcesz używać tylko do mieszania PHP i HTML razem, są krótkie tagi. Może być konieczne włączenie krótkich tagów w pliku php.ini. Po włączeniu krótkie tagi sprawiają, że wszystko jest jeszcze bardziej czytelne.

Bez krótkich znaczników musisz pisać, <?php echo $something; ?>ale przy użyciu krótkich znaczników możesz pisać, <?=$something?>a uzyskasz dokładnie taki sam wynik.

Łącząc krótkie znaczniki i alternatywną składnię PHP, możesz naprawdę pisać eleganckie pliki HTML, które zawierają elementy PHP. Biorąc nasz ostatni przykład pętli (tylko część wewnątrz pętli), krótkie znaczniki pozwalają nam zmniejszyć:

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

do

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

co jest znacznie bardziej czytelne.

Czy możemy pójść dalej? Tak. Korzystając z różnych systemów szablonów, możesz wykonywać następujące czynności:

<li>{thing}</li>

Co jest niezwykle czytelne. Systemy szablonów są jednak znacznie poza zakresem pierwotnego pytania (które zresztą zostawiłem jakiś czas temu).


4
+1 Za bycie dobrą radą dla wszystkich. Alternatywna składnia kontrolna i krótkie znaczniki są niezwykle ważne dla rozpoczęcia pracy z szablonami i oddzielenia logiki od prezentacji.
Will Meldon,

1
Należy stosować ostrożnie krótkie tagi. Jeśli budujesz kod, który będzie ponownie użyty, nie możesz zagwarantować, że short_open_tagdyrektywa będzie zawsze włączona. PHP 5.4 <?=$thing?>udostępnia cały czas, nawet gdy short_open_tagjest wyłączony. Ponadto, short_open_tagjest domyślnie wyłączona, aby uniknąć konfliktów z XML.
Chris

3
+1 za pokazanie różnych alternatyw, przejście do najlepszej odpowiedzi.
Tola Odejayi

1
Może kiedyś było to prawdą, ale właśnie sprawdziłem kody (tj. Co faktycznie działa silnik) w PHP7, a mieszanie PHP / HTML z pewnością nie „oszczędza energii”, unikając przekazywania statycznego tekstu. <?php $foo='ABC'; echo '<div>', $foo, '</div>'i <?php $foo='ABC'; ?><div><?=$foo?></div>dają dokładnie te same kody, tj. są identyczne.
Josh z Qaribou

W notatce o systemach szablonów najprostszym podejściem do szablonów, które pozwoliłoby na twój przykład, jest prosty heredoc. Heredoc pozwala powiedzieć <li>{$thing}</li>tak, jak pokazano, z przewagą nad podwójnymi cudzysłowami, że nie musisz uciec przed podwójnymi cudzysłowami. Możesz także przypisać heredoc lub przekazać go do funkcji, więc jest o wiele czystsze niż php / html, jeśli używasz go w blokach, np. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Josh z Qaribou

4

Uczysz się, zapomnij o wydajności na stronach PHP. Zamiast tego wybierz najłatwiejszy do odczytania .

Patrząc na twoje dwa przykłady, drugi jest zdecydowanie najłatwiejszy do odczytania, chociaż myślę, że wynika to z zastosowanych odstępów. Mówisz, że od samego początku szukasz dobrych nawyków. Myślę, że lepiej jest spędzić czas, poprawiając kod. Może to oznaczać kilkakrotne przepisanie sekcji, dopóki nie będziesz z niej zadowolony.

Jeśli naprawdę lubisz się za kulisami, postaram się wyjaśnić, co dzieje się z treściami statycznymi na stronie PHP. Jedną z pierwszych rzeczy jest „parsowanie” całej strony na kod wykonywalny (tak jak widać między <?php ?>tagami). Jednym z nich jest zamiana dowolnego tekstu statycznego na echo.

Więc to:

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

przekształca się w coś takiego:

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

Przetwarzanie jest bardzo małe, ale nie ma różnicy w wykonywaniu wynikowego kodu. Jeśli używasz akceleratora PHP, parsowanie jest wykonywane tylko raz, a następnie buforowane, więc po załadowaniu pierwszej strony nie zobaczysz żadnej różnicy w wydajności.

Pamiętaj: łatwy do odczytania!


1
Nie zgadzam się. Nie chodzi tylko o wydajność, ale o naukę. Nauka niewłaściwej praktyki nie jest dobrą radą.
Izaak

Nie jest prawdą, że „tekst statyczny” zamienia się w echo, jeśli masz na myśli dosłownie (co sugeruje twój język). Wynik jest taki sam, ale metody są bardzo różne. To, co nazywacie „tekstem statycznym”, w rzeczywistości ucieka z PHP do HTML. Kiedy tak się dzieje, serwer zaczyna wysyłać nieprzetworzony tekst. Nie analizuje go za pośrednictwem PHP, tak jak by to robił echo. Wpływ na wydajność jest prawdopodobnie niewielki w dowolnych okolicznościach, ale różnica mechanistyczna jest ważna.
underscore_d

0

Jedną z najlepszych cech PHP jest to, że jest przeznaczony do osadzania w HTML. Zwykle służy do tworzenia szablonów. Ułatwia odczyt i konserwację kodu, ponieważ oddziela kod PHP od HTML.

Ale jeśli drukujesz tylko statyczną stronę, taką jak „Hello World!” to zły pomysł.


0

Aby odpowiedzieć na twoje pytanie po prostu: biorąc pod uwagę twój przykładowy kod, nie będzie żadnej różnicy w wydajności. PHP jest przetwarzany na poziomie serwera / hosta, podczas gdy HTML jest przetwarzany przez agenta użytkownika / osobę przeglądającą twoją stronę w przeglądarce. Kto będzie szybszy? Trudne do ustalenia.

Zgadzam się z innymi, mówiąc, że każdy ma swoje mocne i słabe strony i może naprawdę dobrze ze sobą współpracować. PHP jest programowalny i może wykonywać obliczenia i pracować ze zmiennymi. Z tego powodu wszystkie moje strony są w końcu PHP i wywołują fragmenty kodu HTML - szablony, jak wspomniano, i wstawiają zmienne, dzięki czemu mój HTML staje się dynamiczny.

W twoim przykładzie możesz połączyć HTML razem w jedną instrukcję PHP w następujący sposób:

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

Mam nadzieję, że to trochę wyjaśni.


0

istnieją ograniczenia w używaniu HTML w PHP.

Przez większość czasu będziesz mieć swój HTML na zewnątrz. Utworzyłbyś stronę tak samo, jak gdybyś nie korzystał z PHP, a następnie dodaj PHP do obszarów dokumentu, w których potrzebujesz. W dokumencie może znajdować się kilka fragmentów PHP.

Praca z PHP Inside HTML zawiera kilka przykładów:

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


-1

Ogólnie uważa się, że wyjściem kodu HTML z PHP jest zła forma. Jest tego kilka przyczyn, ale głównym z nich jest to, że łatwiej, szczególnie na dłuższą metę, utrzymać kod, jeśli kod HTML i PHP są oddzielone.

To jest tak jak HTML, CSS i JavaScript; oddzielenie go jest po prostu o wiele łatwiejsze i bardziej praktyczne.

Z technicznego punktu widzenia nie ma to jednak absolutnie żadnej różnicy w sposobie wyświetlania danych. Dla PHP to tylko bajty z rzędu.


6
To robi różnicę. <?php echo 'hello'; ?>przechodzi do PHP. hellonie jest przekazywane do PHP. Wszystko, co jest przekazywane do PHP, jest konwertowane na kod bajtowy, a następnie interpretowane. Wymaga to czasu, mocy przetwarzania i energii elektrycznej.
Ted
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.