Що краще: включити HTML до PHP-коду чи поза ним?


28

Подивись на це:

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

А тепер подивіться на це:

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

Який із наведених прикладів вважається кращим (принаймні з точки зору продуктивності) ?.

Я знаю, що приклади є тривіальними, але я хочу дотримуватися звичних навичок з самого початку, тому, коли у мене з’являється все більше рядків, вони не впливатимуть на ефективність роботи чи інше негативно.


14
Це не виглядає масово популярним у PHP, але зауважте, що в інших екосистемах обидва вважаються поганими, а належною альтернативою є створення шаблону з усіх статичних частин з мінімальною логікою, щоб включити динамічні частини, а потім зробити його з мова програмування.

1
@delnan - Ви повинні розглянути повідомлення про це як відповідь у дещо розширеній формі. Це набагато чистіше.
jmort253

@ jmort253 Я вважав це, але у мене дуже мало знань про PHP, тому я не міг говорити за кращі практики у світі PHP.

Яку проблему ви намагаєтеся вирішити?
Джим Г.

З точки зору продуктивності це не має значення. Мережа настільки повільніше порівняно. Вартість передачі значно вища, що робить вартість виробництва незначною у порівнянні.
Мартін Йорк

Відповіді:


23

Як зазначає коментар, це слід робити за шаблонами. Але якщо можливий лише твій вибір. Випадок 1 буде кращим. Це те саме поняття, що і надувний макет Android на xml, або програмно, що робить інтерфейс користувача. Ви <br/>є статичним вмістом у вашому HTML, і все, що ваш сервер буде робити, це показати його. Але якщо ви використовуєте php для його виконання, це буде використовувати ресурси ваших серверів та здійснювати обчислення.

Ось як це слід зробити: index.php:

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

header.html і footer.html - шаблони.


1
Я прочитав книгу для Кевіна Янка, яка є "PHP & MySQL для початківців ніндзя" про щось, що називається Контролери та шаблони. Це те саме, про що ви мені розповідали, чи вони різні? якщо вони однакові, як додавання коду в різні файли зробить його краще?
висипав

Шаблони роблять ваш веб-сайт або додаток більш приємним. Ви бачите, наскільки заголовки та колонтитули чи навіть пози StackOverflow однакові? Вони використовують один і той же шаблон і наповнюють його динамічними даними.
wtsang02

Яка головна причина цього? Що робити, якщо ми цього не зробимо? що ми втратимо?
висипав

Давайте розглянемо це. Це четвертий коментар до цього відповіді. Якщо ви зараз переглянете цю сторінку в джерелі, ви побачите "<div> <span ...> ... </span> <a ...> ... </a>" Зображення руки, що кодує 4000-й коментар. Це можливо? або просто зробіть це як шаблон і попросіть ваш сервер "додати" це, коли це потрібно.
wtsang02

1
Також @wtsang, ти ніколи не маєш лише цих двох варіантів, у тебе завжди є третій, біжи (або
вчись

54

Щоб безпосередньо відповісти на ваше запитання: Ніколи не повторюйте статичний текст чи HTML. Залиште це поза вашого PHP.

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

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

Увійти до PHP - це марно, якщо все, що ви збираєтеся зробити, - це передати статичний текст або статичний html. Весь код всередині <?php ?>відправляється на PHP для інтерпретації. Це означає, що ваш веб-сайт повільніше, і ви витрачаєте електроенергію, якщо без жодної причини ви передаєте PHP велику кількість статичного тексту. (Іноді є причина.)

Найкраща практика полягає в тому, щоб ваша логіка та бурхливість працювали у файлах без будь-якого HTML, лише PHP.

Мені подобається це робити з рамкою MVC. У мене є чистий PHP в моделях і контролерах, а також суміш HTML і PHP у видах. Вам не потрібна рамка MVC; ви можете просто вставити суміш HTML у файли шаблонів, які ви потім включите до своїх чистих PHP-файлів.

Після того, як ваші змінні (які не включають HTML в них) створені в чистих PHP-файлах, ви можете передати їх у файл разом із вашим HTML. Там, і тільки там, добре поєднувати HTML і PHP. Але, і це важливо, але, працюючи з файлами, які мають HTML, зведіть PHP до мінімуму.

На щастя, PHP поставляється з дружніми інструментами для полегшення читання PHP при змішуванні з html.

Альтернативний синтаксис

Найкраща практика - використовувати звичайний синтаксис PHP при написанні чистого PHP, але альтернативний синтаксис при змішуванні PHP та HTML.

У звичайних PHP-файлах без HTML:

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

Це прекрасно для чистого PHP, але не ідеально під час виходу з HTML. Зокрема, часто закриття дужок часто важко зрозуміти, коли вони з'являються у великих групах HTML.

Виходячи з вашого запитання, ви б написали у файлі, що змішує HTML та PHP, це:

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

З вищеописаних причин ми хочемо, щоб HTML не надсилався до PHP. Ми робимо це так:

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

Ми отримали наш HTML з тегів PHP, що є вдосконаленням. Але ми могли б піти далі.

Зауважте, наскільки неінформативний фіксатор? Ми не знаємо, чи це закриття циклу, чи оператор if. Це здається тривіальним у наведеному вище прикладі, але часто є десятки рядків HTML всередині if / endif всередині циклу / endloop.

Найкраща практика полягає в тому, що у файлі, що змішує PHP та HTML, ви використовуєте альтернативний синтаксис, який ухиляє дужки відкриття та закриття ( { }):

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

Окрім семантики нового синтаксису ( :а endif;замість {і }), слід помітити дві речі:

  1. Знову ж таки, HTML і текст, хоча вони контролюються PHP, знаходяться поза <?php ?>тегами, тому вони не інтерпретуються. З вищеописаних причин це добре.
  2. Це набагато інформативніше, ніж якби це були всі php, включаючи випадкові дужки закриття ( <?php } ?>) закриття речей, які важко знайти, де вони відкрилися (тому що вони змішані з набором безладного вигляду HTML). Знову ж, уявіть великий HTML-файл із циклами та if операторами. Визначення того, що ви закриваєте, може багато прояснити.

Один і той же синтаксис, сприятливий для шаблонів, може бути використаний і для циклів:

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

Короткі теги

Ще один чудовий інструмент, що надається PHP, який, знову ж таки, ви хочете використовувати лише при змішуванні PHP та HTML разом, - це короткі теги. Можливо, вам доведеться ввімкнути короткі теги у файлі php.ini. Після ввімкнення короткі теги роблять все ще читабельнішим.

Без коротких тегів вам потрібно писати, <?php echo $something; ?>але з короткими тегами ви можете писати, <?=$something?>і це матиме такий самий результат.

Поєднуючи короткі теги та альтернативний синтаксис PHP, ви дійсно можете написати елегантні HTML-файли, до яких входять елементи PHP. Беручи наш останній приклад циклу (лише частина всередині циклу), короткі теги дозволяють нам зменшити:

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

до

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

що набагато читабельніше.

Чи можемо ми піти далі? Так. Використовуючи різні системи шаблонів, ви можете робити такі речі:

<li>{thing}</li>

Що дивно читабельно. Системи шаблонів, однак, виходять за рамки оригінального питання (який я поки що покинув).


4
+1 За те, що є корисною порадою для всіх. Черговий синтаксис керування та короткі теги надзвичайно важливі для початку роботи з шаблонами та відділення логіки від презентації.
Буде Мелдон

1
Короткі теги слід використовувати обережно. Якщо ви будуєте код, який буде повторно використаний, ви не можете гарантувати, що short_open_tagдиректива завжди буде включена. PHP 5.4 робить <?=$thing?>доступним постійно, навіть коли short_open_tagвимкнено. Крім того, short_open_tagвстановлено за замовчуванням вимкнено, щоб запобігти конфліктам з XML.
Кріс

3
+1 за показ різних альтернатив, перехід до найкращої відповіді.
Tola Odejayi

1
Можливо, це було правдою, але я просто перевірив опкоди (тобто те, що насправді працює двигуном) в PHP7, і змішування PHP / HTML, безумовно, не "економить електроенергію", уникаючи передачі статичного тексту. <?php $foo='ABC'; echo '<div>', $foo, '</div>'і в <?php $foo='ABC'; ?><div><?=$foo?></div>результаті виходять абсолютно однакові коди, тобто вони однакові.
Джош з Карібу

У примітці про шаблонні системи найпростішим шаблоновим підходом, який би мав на увазі ваш приклад, є простий гередок. Heredoc дозволяє вам сказати, <li>{$thing}</li>як ви показали, з перевагою перед подвійними лапками, що вам не доведеться уникати подвійних лапок всередині нього. Ви також можете призначити heredoc або передати його функціям, так що php / html набагато чіткіше, якщо ви використовуєте його в блоках, наприклад. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Джош з Карібу

4

Ви навчаєтесь, забуваєте про продуктивність на сторінках PHP. Натомість виберіть той спосіб, який найпростіше читати .

Переглядаючи ваші два приклади, другий, безумовно, найпростіший для читання, хоча я думаю, що це через проміжки, які ви використовували. Ви кажете, що хочете розвинути добрі звички з самого початку, я думаю, що ваш час можна краще витратити, зробивши ваш код добре прочитаним. Це може означати переписування розділу кілька разів, поки ви не будете задоволені цим.

Якщо ви дійсно зацікавлені у закуліссі, я спробую пояснити, що відбувається зі статичним вмістом на сторінці PHP. Одне з перших речей - "розібрати" всю сторінку у виконуваний код (як ви бачите між <?php ?>тегами). Однією з частин цього є перетворення будь-якого статичного тексту в echo.

Отже це:

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

перетворюється на щось на кшталт:

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

Існує дуже невелика вартість, пов'язана з розбором, але різниці в виконанні отриманого коду немає. Якщо ви використовуєте прискорювач PHP, синтаксичний аналіз проводиться лише один раз, а потім кешується, так що ви не побачите різниці в продуктивності після завантаження першої сторінки.

Пам'ятайте: легко читати!


1
Я не погоджуюсь. Йдеться не лише про виставу, а насправді про навчання. Навчитися неправильній практиці не є гарною порадою.
Ісаак

Це неправда, що "статичний текст" перетворюється на echo, якщо ви маєте на увазі це буквально (що має на увазі ваша мова). Результат той самий, але методи дуже різні. Те, що ви називаєте "статичним текстом", насправді переходить від PHP до HTML. Коли це станеться, сервер починає надсилати необроблений текст. Він не розбирає його через PHP, як це було б з echo. Наслідки для продуктивності, ймовірно, невеликі за будь-яких непродуманих обставин, але важлива механічна різниця.
підкреслюй_d

0

Однією з найкращих особливостей PHP було те, що він створений для вбудовування в HTML. Зазвичай використовується при створенні шаблонів. Це полегшує ваш код для читання та обслуговування, оскільки він відокремлює код PHP від ​​HTML.

Але якщо ваш єдиний друкує статичну сторінку на кшталт "Hello World!" це погана ідея.


0

Щоб відповісти на ваше запитання просто: з огляду на прикладний код, різниця у виконанні буде незначною. PHP обробляється на рівні сервера / хоста, тоді як HTML обробляє агент користувача / особа, яка переглядає вашу веб-сторінку у своєму браузері. Хто швидше буде? Важко визначити.

Я погоджуюся з іншими, кажучи, що кожен має свої сильні та слабкі сторони і може працювати дуже добре разом. PHP програмується і може робити розрахунки та працювати зі змінними. З цієї причини всі мої сторінки в кінцевому підсумку є PHP і викликають фрагменти HTML-коду - шаблони, як було зазначено, і вставляють змінні, щоб мій HTML став динамічним.

У вашому прикладі ви можете зв'язати HTML разом в один заяву PHP так:

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

Сподіваюсь, що допоможе трохи прояснити.


0

є обмеження щодо використання HTML в PHP.

Більшу частину часу у вас був би HTML. Ви б створили сторінку так само, як і якщо не використовуєте PHP, то додайте PHP в області документа, де вам це потрібно. Ви можете мати кілька фрагментів PHP в документі.

Робота з PHP Inside HTML має кілька прикладів:

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


-1

Зазвичай вважається поганою формою виведення HTML-коду з PHP. Причин цьому декілька, але головна з них полягає в тому, що простіше підтримувати код, якщо код HTML та PHP розділений.

Це так само, як HTML, CSS та Javascript; просто набагато простіше і практичніше тримати його окремо.

Технічно, однак, це абсолютно не має різниці в тому, як ви випускаєте речі. Для PHP це просто байти підряд.


6
Це має значення. <?php echo 'hello'; ?>передається до PHP. helloне проходить до PHP. Все, що передається PHP, перетворюється на байт-код, а потім інтерпретується. Для цього потрібен час, потужність обробки та електроенергія.
Тед
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.