Qual é o melhor: incluir HTML dentro do código PHP ou fora dele?

28

Veja isso:

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

E agora veja isso:

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

Qual dos exemplos acima é considerado melhor (pelo menos do ponto de vista do desempenho) ?.

Sei que os exemplos são triviais, mas quero seguir os hábitos de boas práticas desde o início; portanto, quando tenho mais e mais linhas, elas não afetam o desempenho ou o que quer que seja de maneira negativa.

precipitado
fonte
14
Isso não parece ser muito popular no PHP, mas observe que em outros ecossistemas, ambos são considerados ruins e a alternativa adequada é criar um modelo de todas as partes estáticas com lógica mínima para incluir partes dinâmicas e depois renderizá-lo a partir do linguagem de programação.
11
@ delnan - Você deve postar isso como resposta, de forma um pouco expandida. Isso é muito mais limpo.
jmort253
@ jmort253 Considerei, mas eu tenho muito pouco conhecimento de PHP, então não pude falar das melhores práticas no mundo do PHP.
Que problema você está tentando resolver?
Jim G.
Em termos de desempenho, isso não importa. A rede é muito mais lenta em comparação. O custo de transferência é significativamente maior, tornando o custo de geração insignificante em comparação.
Martin York

Respostas:

23

Como o comentário indica, isso deve ser feito por modelos. Mas se apenas duas opções forem possíveis. O caso 1 será melhor. Esse é o mesmo conceito que o layout inflável do Android por xml ou a criação da interface do usuário por meio de programação. Seu <br/>é um conteúdo estático do seu html e tudo o que seu servidor fará será mostrá-lo. Mas se você usar php, para executá-lo, isso usará os recursos de seus servidores e estará computando.

É assim que deve ser feito: index.php:

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

header.html e footer.html são modelos.

wtsang02
fonte
11
Eu li um livro para Kevin Yank que é "PHP & MySQL Novice to Ninja" sobre algo chamado Controladores e modelos. Essas são as mesmas coisas que você estava me falando ou são diferentes? se eles são iguais, como colocar o código em arquivos diferentes fará com que ele tenha um desempenho melhor?
precipitado 24/12/12
Os modelos tornam seu site ou aplicativo mais personalizado. Você vê como os cabeçalhos, rodapés e até postagens do StackOverflow são iguais? Eles estão usando o mesmo modelo e o preenchendo com dados dinâmicos.
wtsang02
Qual é a principal razão por trás disso? E se não fizermos dessa maneira? o que vamos perder?
precipitado
Vamos olhar para isso. Este é o quarto comentário desta resposta. Se você visualizar esta página na fonte agora, verá "<div> <span ...> ... </span> <a ...> ... </a>" Mão de imagem codificando o 4000º comentário. Isso é possível? ou apenas faça isso como modelo e faça com que seu servidor 'adicione' isso quando necessário.
wtsang02
11
Também @wtsang, você nunca só tem essas duas opções, você sempre tem um terceiro, run (ou aprender.)
ocodo
54

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:

  1. 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.
  2. 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).

Ted
fonte
4
+1 por ser um bom conselho para todos. Sintaxe de controle alternativa e tags curtas são imensamente importantes para começar com modelos e separar a lógica da apresentação.
Will Meldon
11
Etiquetas curtas devem ser usadas com cautela. Se você estiver criando um código que será reutilizado, não poderá garantir que a short_open_tagdiretiva esteja sempre ativada. O PHP 5.4 <?=$thing?>disponibiliza o tempo todo, mesmo quando short_open_tagestá desativado. Além disso, short_open_tagestá desativado como padrão para evitar conflitos com XML.
22412 Chris
3
+1 para mostrar as diferentes alternativas, progredindo para a melhor resposta.
Tola Odejayi
11
Talvez isso fosse verdade, mas acabei de verificar os códigos de código (ou seja, o que realmente é executado pelo mecanismo) no PHP7, e misturar PHP / HTML certamente não "economiza eletricidade", evitando passar texto estático. <?php $foo='ABC'; echo '<div>', $foo, '</div>'e <?php $foo='ABC'; ?><div><?=$foo?></div>resultam exatamente nos mesmos opcodes, ou seja, são idênticos.
Josh de Qaribou
Na observação sobre sistemas de modelos, a abordagem mais simples que permitiria o seu exemplo é um heredoc simples. O Heredoc permite que você diga <li>{$thing}</li>como mostrou, com a vantagem das aspas duplas, de que não precisa escapar das aspas duplas dentro dela. Você também pode atribuir o heredoc ou passá-lo para funções, por isso é muito mais limpo que o php / html se você o estiver usando em blocos, por exemplo. array_reduce($items, function($s, $item) { $name = htmlspecialchars($item['name']); return $s . <<< EOT <li>{$name}: {$item['price']}</li> EOT; })
Josh de Qaribou
4

Você está aprendendo, esqueça o desempenho nas páginas PHP. Em vez disso, escolha a maneira mais fácil de ler .

Olhando para seus dois exemplos, o segundo é definitivamente mais fácil de ler, embora eu ache que é por causa do espaçamento que você usou. Você diz que deseja desenvolver bons hábitos desde o início, acho que seu tempo pode ser melhor gasto fazendo seu código ser lido bem. Isso pode significar reescrever uma seção várias vezes até que você esteja feliz com ela.

Se você está realmente interessado nos bastidores, explicarei o que acontece com o conteúdo estático em uma página PHP. Uma das primeiras coisas é "analisar" a página inteira em código executável (como você vê entre as <?php ?>tags). Uma parte disso é transformar qualquer texto estático em um echo.

Então, é isso:

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

é transformado em algo como:

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

Há um custo muito pequeno associado à análise, mas não há diferença na execução do código resultante. Se você estiver usando um acelerador PHP, a análise será feita apenas uma vez e depois armazenada em cache, para que você não veja diferença de desempenho após o carregamento da primeira página.

Lembre-se: fácil de ler!

GavinH
fonte
11
Discordo. Não se trata apenas de desempenho, mas de aprendizado. Não é um bom conselho para aprender uma prática errada.
Isaac #
Não é verdade que "texto estático" seja transformado em um echo, se você quer dizer isso literalmente (o que seu idioma implica). O resultado é o mesmo, mas os métodos são muito diferentes. O que você chama de "texto estático" está de fato escapando do PHP para o HTML. Quando isso acontece, o servidor começa a enviar texto não processado. Ele não o analisa via PHP, como faria com echo. As implicações de desempenho são provavelmente pequenas em qualquer circunstância não planejada, mas a diferença mecanicista é importante.
Underscore_d
0

Uma das melhores características do PHP foi que ele foi projetado para ser incorporado em HTML. Geralmente é usado na criação de modelos. Isso torna seu código mais fácil de ler e manter, porque separa o código PHP do HTML.

Mas se você estiver imprimindo apenas uma página estática como "Olá, mundo!" É uma má idéia.

4ldrich
fonte
0

Para responder sua pergunta simplesmente: dado seu código de exemplo, haverá pouca ou nenhuma diferença no desempenho. O PHP é processado no nível do servidor / host, enquanto o HTML é processado pelo agente / pessoa do usuário que olha a sua página da web no navegador. Quem será mais rápido? Difícil de determinar.

Concordo com outros que dizem que cada um tem seus pontos fortes e fracos e podem trabalhar muito bem juntos. O PHP é programável e pode fazer cálculos e trabalhar com variáveis. Por esse motivo, todas as minhas páginas acabam sendo PHP e recorrem a trechos de modelos de código HTML, como mencionado, e inserem variáveis ​​para que meu HTML se torne dinâmico.

No seu exemplo, você pode agrupar o HTML em uma instrução PHP da seguinte forma:

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

Espero que ajude a esclarecer um pouco.

Michael Moriarty
fonte
0

existem limitações no uso de HTML no PHP.

Na maioria das vezes você teria seu HTML fora. Você criaria uma página da mesma forma que faria se não estivesse usando o PHP e, em seguida, adicione o PHP nas áreas do documento onde precisar. Você pode ter vários pedaços de PHP em um documento.

Trabalhando com PHP Inside HTML tem alguns exemplos:

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

Purvi Barot
fonte
-1

Geralmente, é considerado uma forma incorreta gerar código HTML a partir do PHP. Existem várias razões para isso, mas a principal é que é mais fácil, especialmente a longo prazo, manter o código se o código HTML e PHP estiver separado.

É como HTML, CSS e Javascript; é muito mais fácil e prático mantê-lo separado.

Tecnicamente, no entanto, não faz absolutamente nenhuma diferença como você produz coisas. Para o PHP, são apenas bytes seguidos.

Sverri M. Olsen
fonte
6
Faz diferença. <?php echo 'hello'; ?>é passado para o PHP. hellonão é passado para o PHP. Tudo o que é passado para o PHP é convertido em bytecode e depois interpretado. Isso leva tempo, poder de processamento e eletricidade.
Ted