Para responder diretamente à sua pergunta: nunca faça eco de texto estático ou HTML. Deixe isso fora do seu PHP.
<?php echo "<p>Hello World</p>"; // Alway wrong. ?>
<p>Hello World</p> <!-- Does the same thing, faster, and is more readable. -->
Escapar para o PHP é um desperdício, se tudo o que você vai fazer é passar texto estático ou html estático. Todo o código dentro de <?php ?>
é enviado ao PHP para ser interpretado. Isso significa que seu site é mais lento e você está desperdiçando eletricidade se estiver transmitindo grandes quantidades de texto estático para PHP sem motivo. (Às vezes há uma razão.)
A melhor prática é fazer com que sua lógica e grunhido funcionem em arquivos sem HTML, apenas PHP.
O jeito que eu gosto de fazer isso é com uma estrutura MVC. Eu tenho PHP puro nos modelos e controladores e uma mistura de HTML e PHP nas visualizações. Você não precisa de uma estrutura MVC; você pode simplesmente colocar sua mistura de HTML em arquivos de modelo, que você incluirá em seus arquivos PHP puros.
Depois de ter suas variáveis (que não incluem HTML nelas) criadas em arquivos PHP puros, você pode transmiti-las ao arquivo com seu HTML. Lá, e somente lá, é bom misturar HTML e PHP. Porém, e isso é importante, mas, ao trabalhar com arquivos que possuem HTML, mantenha o PHP no mínimo.
Felizmente, o PHP vem com ferramentas amigáveis para facilitar a leitura do PHP quando misturado ao html.
Sintaxe alternativa
A melhor prática é usar a sintaxe PHP regular ao escrever PHP puro, mas a sintaxe alternativa ao misturar PHP e HTML.
Em arquivos PHP regulares sem HTML:
if ($something) {
do_something(); // do_something() shouldn't echo or print.
}
Isso é bonito para o PHP puro, mas não é o ideal para escapar do HTML. Em particular, as chaves de fechamento geralmente são difíceis de entender quando aparecem em grandes pilhas de HTML.
Parece, com base na sua pergunta, que você teria escrito, em um arquivo que mistura HTML e PHP, o seguinte:
<?php
if ($something) {
echo '<p>Hello World.</p>';
}
?>
Pelas razões descritas acima, queremos que o HTML não seja enviado ao PHP. Fazemos o seguinte:
<?php if ($something) { ?>
<p>Hello World.</p>
<?php } ?>
Tiramos nosso HTML de nossas tags PHP, o que é uma melhoria. Mas poderíamos ir mais longe.
Observe como a chave de fechamento não é informativa? Não sabemos se está fechando um loop ou uma declaração if. Isso parece trivial no exemplo acima, mas geralmente existem dezenas de linhas de HTML dentro do if / endif dentro de um loop / endloop.
A melhor prática é que, em um arquivo que mistura PHP e HTML, você usa a sintaxe alternativa, que omite as chaves de abertura e fechamento ( { }
):
<?php if ($something): ?>
<p>Hello world.</p>
<?php endif; ?>
Além da semântica da nova sintaxe ( :
e em endif;
vez de {
e }
), você deve observar duas coisas:
- Novamente, o HTML e o texto, enquanto controlados pelo PHP, estão fora das
<?php ?>
tags, portanto não são interpretados. Pelas razões descritas acima, isso é bom.
- Isso é muito mais informativo do que se tudo isso fosse php, incluindo chaves de fechamento aleatórias (
<?php } ?>
) fechando coisas difíceis de encontrar onde elas foram abertas (porque elas são misturadas com um monte de HTML confuso). Novamente, imagine um grande arquivo HTML com loops e instruções if. A especificação do que você está fechando pode esclarecer muito.
A mesma sintaxe amigável para modelos também pode ser usada para loops:
<?php foreach ($things as $thing): ?>
<li><?php echo $thing; ?></li>
<?php endforeach; ?>
Tags curtas
Outra ótima ferramenta fornecida pelo PHP que, novamente, você só deseja usar ao misturar PHP e HTML, são as tags curtas. Talvez você precise ativar as tags curtas no arquivo php.ini. Uma vez ativadas, as tags curtas tornam tudo ainda mais legível.
Sem tags curtas, você precisa escrever, <?php echo $something; ?>
mas com tags curtas, você pode escrever <?=$something?>
e terá exatamente o mesmo resultado.
Ao combinar tags curtas e a sintaxe alternativa do PHP, você pode realmente escrever alguns arquivos HTML elegantes, que incluem elementos PHP. Tomando nosso último exemplo de loop (apenas a parte dentro do loop), as tags curtas nos permitem reduzir:
<li><?php echo $thing; ?></li>
para
<li><?=$thing?></li>
o que é muito mais legível.
Poderíamos ir além? Sim. Usando vários sistemas de modelos, você pode fazer coisas como:
<li>{thing}</li>
O que é incrivelmente legível. Os sistemas de modelos, no entanto, estão muito fora do escopo da pergunta original (que deixei há um tempo atrás).