Что лучше: включить 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 являются шаблонами.

wtsang02
источник
1
Я прочитал книгу для Кевина Янка, которая называется «PHP & MySQL Novice to Ninja» о чем-то, называемом «Контроллеры и шаблоны». Это то же самое, о чем вы мне говорили, или они разные? если они одинаковы, как размещение кода в разных файлах сделает его работу лучше?
прорвался
Шаблоны делают ваш сайт или приложение более гибкими. Видите ли вы, как верхние и нижние колонтитулы или даже посты StackOverflow одинаковы? Они используют один и тот же шаблон и заполняют его динамическими данными.
wtsang02
Какова основная причина этого? Что если мы не сделаем это таким образом? что мы потеряем?
прорвался
Давайте посмотрим на это. Это 4-й комментарий к этому ответу. Если вы сейчас просматриваете эту страницу в источнике, вы увидите "<div> <span ...> ... </ span> <a ...> ... </a>" Изображение, кодирующее 4000-й комментарий. Это возможно? или просто сделайте это как шаблон, и ваш сервер «добавит» это, когда это необходимо.
wtsang02
1
Кроме того, @wtsang, у вас никогда не бывает только этих двух вариантов, у вас всегда есть третий, бегите (или учитесь)
ocodo
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. В приведенном выше примере это кажется тривиальным, но внутри if / endif внутри цикла / endloop часто бывают десятки строк HTML.

Лучшая практика заключается в том, что в файлах, смешивающих 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 за показ различных альтернатив, переходя к лучшему ответу.
Тола Одежаи
1
Возможно, раньше это было правдой, но я только что проверил коды операций (то есть, что на самом деле работает движком) в PHP7, и смешивание PHP / HTML, конечно, не «экономит электроэнергию», избегая передачи статического текста. <?php $foo='ABC'; echo '<div>', $foo, '</div>'и <?php $foo='ABC'; ?><div><?=$foo?></div>привести к точно таким же кодам операций, то есть они идентичны.
Джош из Карибу
На заметку о системах шаблонов, простейший подход к шаблонам, который учитывает ваш пример, - это простой heredoc. 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-ускоритель, анализ выполняется только один раз, а затем кэшируется, поэтому вы не увидите никакой разницы в производительности после загрузки первой страницы.

Помните: легко читать!

GavinH
источник
1
Я не согласен. Речь идет не только о производительности, но и об обучении. Это плохой совет, чтобы выучить неправильную практику.
Исаак
Неверно, что «статический текст» превращается в « echoбуквально», если вы подразумеваете это буквально (что подразумевает ваш язык). Результат тот же, но методы очень разные. То, что вы называете «статическим текстом», фактически переходит из PHP в HTML. Когда это происходит, сервер начинает отправлять необработанный текст. Он не анализирует его через PHP, как это было бы с echo. Возможные последствия для производительности, вероятно, невелики в любых необдуманных обстоятельствах, но важна механистическая разница.
underscore_d
0

Одной из лучших особенностей PHP было то, что он предназначен для встраивания в HTML. Обычно используется при создании шаблонов. Это делает ваш код легче для чтения и обслуживания, потому что он отделяет код PHP от HTML.

Но если вы печатаете только статическую страницу типа "Hello World!" это плохая идея

4ldrich
источник
0

Чтобы ответить на ваш вопрос просто: учитывая ваш пример кода, будет мало различий в производительности. PHP обрабатывается на уровне сервера / хоста, тогда как HTML обрабатывается агентом пользователя / человеком, который просматривает вашу веб-страницу в своем браузере. Кто будет быстрее? Сложно определить.

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

В вашем примере вы можете объединить HTML-код в один оператор PHP следующим образом:

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

Надеюсь, что это поможет немного прояснить.

Майкл Мориарти
источник
0

Существуют ограничения на использование HTML в PHP.

Большую часть времени у вас будет ваш HTML снаружи. Вы бы создали страницу так же, как если бы вы не использовали PHP, а затем добавили бы PHP в те области документа, где вам это нужно. Вы можете иметь несколько кусков PHP в документе.

Работа с PHP внутри 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, преобразуется в байт-код, а затем интерпретируется. Это требует времени, вычислительной мощности и электричества.
Тед