Por que ter <? Php e?> Em todas as linhas


24

Eu já vi essa convenção praticamente em todos os lugares e, às vezes, chega perto de me deixar louco:

<?php //The loop ?>
<?php while ( have_posts() ) : the_post(); ?>
    <?php the_content(); ?>
<?php endwhile; // end of the loop. ?>

Onde o <?phpe o fechamento ?>estão em cada linha, mesmo se não houver código HTML intermediário.

Minha pergunta é: por que? Por que incluir todas essas tags extras?

Para mim, parece que essa convenção adiciona uma quantidade significativa de confusão ao código, é chato seguir em primeiro lugar e acrescenta que muitos outros lugares para deixar acidentalmente de fora uma marca de abertura ou fechamento.

NOTA

Este é um código extraído do tema Twenty-Twelve, o exemplo dado pelo WordPress.


também, shorthand while statement = o
Tom J Nowell

3
Sinalizando para perto - não há uma resposta definitiva para essa pergunta, e certamente não é uma questão WP específico - qualquer pessoa que trabalha com PHP irá enfrentar esta questão
anu

3
@anu: Primeiro, uma pergunta pode nem sempre ter uma resposta única e definitiva (embora ainda possa ter a melhor resposta). As diretrizes dizem "prático e responsável". Segundo, sim, isso é tecnicamente um problema de PHP, mas já vi isso muito, muito mais no meu curto período de tempo trabalhando com o WP. Portanto, embora isso não esteja limitado ao WP, parece-me correlacionado o suficiente para perguntar em uma configuração do WP.
precisa saber é o seguinte

Respostas:


20

Isso não é recomendado em nenhum guia de estilo do WordPress, e acho que é um estilo de codificação ruim. Os iniciantes estão usando esse estilo, talvez porque pareça mais com HTML…

Infelizmente, os temas padrão estão usando esse estilo com muita frequência; portanto, alguns iniciantes podem pensar que faz parte de um estilo de código.

Uma desvantagem desse estilo é a manipulação de comentários. Observe atentamente o exemplo a seguir e como ele não faz o que o autor pode esperar:

<?php echo 'Important: '; // announcement ?>
<?php echo ' enter the word '; /* start ?>
<?php echo '<b>password</b>'; /* the end */ ?>

Boa sorte depurando isso. :)

Regra: alterne entre o contexto PHP e HTML somente se você precisar criar uma saída nos dois idiomas. Use quebras de linha regulares em todos os outros casos.

Atualização, novas idéias: todo arquivo HTML válido é um programa PHP completo e válido. Sim, mesmo que não contenha uma única linha de código PHP real.

Se você começar do HTML e adicionar pequenos pedaços de PHP passo a passo ... você pode acabar com o estilo que estamos discutindo aqui. É aí que entra em jogo a refatoração : uma vez que tudo funcione conforme o esperado, reescreva o código até que seja o mais legível possível, fácil de manter e estender, sem repetir partes.

Acho que algumas pessoas ficam felizes sem esse último passo, e é por isso que isso não vai morrer tão cedo.


É uma pena que o destaque da sintaxe acima não mostre o que realmente acontece com esse comentário ...
webaware

9
Acho que isso ilustra o problema ainda mais. :)
fuxia

Verdadeiro :) (mais alguns caracteres para manter a polícia de comentários SE feliz) #
webaware

2
@AndyAdams Fair bastante, eu reformulei isso. E agora vá embora, seu mal recomendado. :)
fuxia

3
Os temas usam esse estilo porque fazer o contrário é muito feio. Ao refatorar temas, prefiro reescrever o código para ser o mais legível possível, e isso significa não ter echo / printf / var_dump por toda parte e colocar cada estrutura de controle dentro de seus próprios pares <? ... ?>para facilitar o entendimento do aninhamento. Uma coisa que eu faria de maneira diferente do exemplo do OP é que eu colocaria the_post();sua própria linha.
usar o seguinte comando

12

Embora eu evite isso nos comentários do PHP, sou um ávido iniciador / abridor de PHP nos arquivos de modelo. A alternativa envolve repetir o HTML via strings PHP, o que parece ainda pior na minha opinião. Como um exemplo primitivo:

<!-- Example 1 -->
<ul>
    <?php
        foreach ( $list_items as $list_item ) {
            echo "<li><a href='" . $list_item->url . "'>" . $list_item->name . "</a></li>";
        }
    ?>
</ul>

<!-- Example 2 -->
<ul>
    <?php foreach ( $list_items as $list_item ) : ?>
        <li>
            <a href="<?php echo $list_item->url; ?>">
                <?php echo $list_item->name; ?>
            </a>
        </li>
    <?php endforeach; ?>
</ul>

O exemplo 2 é mais detalhado? Possivelmente? Mas mais fácil de ler e editar, na minha opinião. Você pode imaginar o quão feio pode ficar para HTML complexo.

Além disso, assim como uma nota lateral: usando endforeache endifao escrever HTML entre o PHP evoluiu lógica legibilidade uma tonelada em comparação com }.


5
a grande vantagem do }excesso, endifporém, é que (em muitos editores) você pode ver facilmente onde está a abertura {e, portanto, se tudo foi fechado corretamente. Tente descobrir isso com endife todo um conjunto de condicionais ...

2
foreach ( $list_items as $list_item ) printf( '<li><a href="%1$s">%2$s</a></li>', $list_item->url, $list_item->name );- duas linhas, HTML e PHP bem separadas. : P
fuxia

4
@toscho: Você perdeu totalmente o objetivo. Você ainda está misturando PHP e HTML, pessoas que preferem o segundo estilo fazem isso porque queremos evitar ter HTML dentro da string PHP. Uso o segundo estilo ao usar o PHP como uma linguagem de modelagem, porque é a única maneira de aninhar sensivelmente uma mistura de PHP e HTML, enquanto uso o primeiro ao usar o PHP como uma linguagem de script, porque geralmente não há boas razões para ter HTML no script quando você separa a lógica do aplicativo do modelo. O segundo estilo seria ainda melhor se tags curtas estiverem disponíveis: <? ... ?>e <?= ... ?>.
usar o seguinte comando

11
@ Piet: se você tiver problemas para combinar chaves, provavelmente nunca ouviu falar de indentação? Além disso, você deve poder configurar para destacar a abertura de endifqualquer editor decente.
usar o seguinte comando

4
@LieRyan Seja legal.
Rarst

10

É sobre a escolha entre ver a página como:

  • como entidade completamente gerada por PHP
  • como modelo de documento HTML, desenvolvido com tags de modelo PHP

Pessoas diferentes tendem a pensar sobre isso de maneira diferente. Observe que as funções raramente usam esse estilo, porque parecem mais um bloco de PHP puro. Por outro lado, não é incomum nos modelos, porque eles são mais espalhados pelos arquivos e a quantidade de HTML puro pode ser facilmente mais do que a do PHP neles.

Se você observar os mecanismos de modelagem (Bigode, Twig, etc) - eles se parecem muito com esse estilo, exceto que sua sintaxe tende a eliminar a verbosidade do PHP comum.

PS: Quero observar que estou falando sobre a incorporação de PHP em HTML, não literalmente abrindo e terminando tags em todas as linhas apenas por isso.


2

Minha pergunta é: por que? Por que incluir todas essas tags extras?

A resposta é bem simples: público. Quando as pessoas (não os programadores) escolhem um tema, o FTP é instalado na instalação, a execução da configuração de 5 minutos e assim por diante já parece a programação para eles. Quando eles desejam adicionar ou alterar uma única linha do que quer que seja em seu tema, talvez já tenham descoberto o que é HTML. O PHP ainda estará longe de seu alcance. Então, meu palpite é que a idéia por trás disso é permitir adicionar ou remover elementos mais facilmente, sem quebrar tudo quando eles cometem um erro.

Nota: Não é disso que eu gosto, prefiro ou recomendo. É exatamente o que penso por que isso acontece.


0

Eu descobri que alguns novos programadores são treinados dessa maneira. Estou seguindo um curso de 40 horas sobre Lynda e o instrutor está soltando tags PHP em todas as linhas, com exceção das definições de função. Provavelmente é preciso traçar claramente linhas entre HTML e PHP, o que provavelmente ajuda as novas pessoas a entender onde o HTML termina e o PHP começa. Depois disso, provavelmente é um hábito. Eu estava começando a ficar irritado com isso e decidi ver se mais alguém estava reclamando.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.