Diferença entre if () {} e if (): endif;

158

Existem diferenças entre ...

if ($value) {

}

...e...

if ($value):

endif;

?

alex
fonte
A segunda maneira existe desde o PHP4, se não antes.
Miles
1
A maioria das respostas não aborda realmente o ponto principal : o que funciona melhor quando você está olhando para algum código e há muitos comandos de fechamento, como } } } }(o que também pode ser feito endif) e você deseja saber onde eles foram abertos? A resposta é nenhuma . É basicamente a primeira "regra" dos princípios de design de python .
cregox
7
Obviamente {}é melhor e : endif;é uma atrocidade que não existiria se a vida fosse justa. Com um bom editor de texto, você terá um atalho de teclado para colchetes correspondentes, para pular da abertura para o fechamento ou vice-versa. Nada disso jamais poderia existir para a : endif;sintaxe hedionda .
Developerwjk
3
@developerwjk como isso nunca poderia existir?
5284 alex

Respostas:

176

Eles são os mesmos, mas o segundo é ótimo se você tiver MVC no seu código e não quiser ter muitos ecos no seu código. Por exemplo, nos meus .phtmlarquivos (Zend Framework) vou escrever algo como isto:

<?php if($this->value): ?>
Hello
<?php elseif($this->asd): ?>
Your name is: <?= $this->name ?>
<?php else: ?>
You don't have a name.
<?php endif; ?>
Thomaschaaf
fonte
38
@alex Também funcionará com colchetes, mas pelo menos pessoalmente, acho isso mais claro em coisas como essa. Porque eles sabem que é o fim de um if e não o fim de um loop de algum tipo ou de outra coisa. Pense que você tem um fim ou fim ou algo semelhante também.
Svish
10
Eu não usaria o <? =?> Porque ele não é suportado em todos os servidores, especialmente nos servidores de hospedagem compartilhada que não permitem alterar o php.ini.
Siqi Lin
2
O ponto pertinente é <? Php endif; ?> - você pode dizer exatamente o que está terminando, mesmo com muitas linhas de HTML entre o if / else anterior e esta declaração.
Fenton
7
por que "o segundo é ótimo se você não deseja ter muitos ecos no seu código"? Eu acho que é o mesmo para a sintaxe tradicional {}também. Nenhum eco extra é necessário <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. Qual é a diferença <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu
9
Não sei por que essa resposta é a mais alta, pois não é um ótimo exemplo (você pode obter exatamente o mesmo com chaves).
Reinier Kaper
69

Eu pessoalmente odeio a sintaxe alternativa. Uma coisa boa sobre os aparelhos é que a maioria dos IDEs, vim, etc, todos têm destaque de suporte. No meu editor de texto, posso clicar duas vezes em uma chave e ela destacará todo o bloco, para que eu possa ver onde termina e começa com muita facilidade.

Não conheço um único editor que possa destacar endif, endforeach etc.

impedir
fonte
11
Isso deve ser usado em modelos PHP, onde o início e o fim do bloco são separados por partes da linguagem estrangeira. Se o seu IDE entende o PHP bem o suficiente para analisar isso, ele também deve ser destacado endifcomo final de bloco corretamente. Caso contrário, você realmente não compra nada usando, }pois não será compatível de qualquer maneira.
Pavel Minaev 16/07/2009
2
A maioria dos ide's (pelo menos os que eu usei) destacam apenas {}
AntonioCS
11
Netbeans 7.x felizmente destaques endforeach, endif, etc correspondentes
Jonathan Dia
@Sr. Minaev: O par de chaves irá analisar corretamente provavelmente em 98% dos casos, mesmo que exista um código estrangeiro. Ele falhará apenas quando houver uma chave ezotérica "abrindo, mas não fechando código" dentro dela. Sim, acontece, mas raramente acontece. Por que você acha que um complexo "fim-qualquer;" abordagem analisador fará melhor na prática, do que a solução simples?
PatlaDJ
Eu acho que o ponto mais importante é ser descritivo , quando necessário. Assim, podemos encontrar facilmente onde estava aberto, independentemente de qual ferramenta precisarmos usar. Especialmente verdadeiro para PHP, que de tempos em tempos você precisa ver usando os editores mais simplistas.
cregox
49

Eu acho que isso diz tudo:

essa sintaxe alternativa é excelente para melhorar a legibilidade (para PHP e HTML!) em situações em que você tem uma mistura delas.

http://ca3.php.net/manual/en/control-structures.alternative-syntax.php

Ao misturar HTML e PHP, o sytnax alternativo é muito mais fácil de ler. Em documentos PHP normais, a sintaxe tradicional deve ser usada.


fonte
7
+1, resposta agradável sobre qual é a sua finalidade. Pessoalmente, acho que é uma adição inútil a uma linguagem já confusa.
Draemon
29

Em nossa empresa, a maneira preferida para lidar com HTML é:

<? if($condition) { ?>
   HTML content here
<? } else { ?>
   Other HTML content here
<? } ?>

No final, é realmente uma questão de escolher um e continuar com ele.

gahooa
fonte
Obrigado - atualizei esta resposta. Ele bate um pouco no mato, mas pode ajudar.
gahooa
Quem você quer dizer quando diz "nosso"?
Oddthinking 19/02/09
+1 por evitar declarações de eco excessivas e aspas escapadas. :)
John McCollum
Erro:<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub
13

Eles são realmente os mesmos, funcionalmente.

Mas se o assunto endifestiver muito longe do correspondente if, acho que é uma prática muito melhor fazer um comentário de referência. Só assim você pode encontrar facilmente onde foi aberto. Independentemente do idioma, é:

if (my_horn_is_red or her_umbrella_is_yellow)
{

    // ...

    // let's pretend this is a lot of code in the middle

    foreach (day in week) {
        sing(a_different_song[day]);
    }

    // ...

} //if my_horn_is_red

Isso realmente se aplica a qualquer "coisa de fechamento" análoga! ;)

Além disso, em geral, os editores lidam melhor com colchetes, no sentido em que podem apontar para onde ele estava aberto. Mas mesmo isso não torna os comentários descritivos menos válidos.

cregox
fonte
1
concorda que isso é muito melhor - em vez de digitar endif - você pode dizer o que a condição if está realmente fazendo.
cartalot
@ cartalot talvez fosse até bom ter construído na linguagem (como um argumento opcional de fechamento de bloco nomeado), para que pudéssemos ter erros ao fechar blocos errados em lugares errados! :)
cregox
9

Eu acho que é particularmente claro quando você usa uma mistura de ifs, fores e foreaches nos scripts de exibição:

<?php if ( $this->hasIterable ): ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ):?>
        <?php for ( $i = 0; $i <= $val; $i++ ): ?>
        <li><?php echo $key ?></li>
        <?php endfor; ?>
    <?php endforeach; ?>
    </ul>
<?php elseif ( $this->hasScalar ): ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ): ?>
    <p>Foo = Bar</p>
    <?php endfor; ?>
<?php else: ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ): ?>
    <p>Spam</p>
    <?php else: ?>  
    <p>Eggs</p>  
    <?php endif; ?>
<?php endif; ?>

em oposição a:

<?php if ( $this->hasIterable ){ ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ){?>
        <?php for ( $i = 0; $i <= $val; $i++ ){ ?>
        <li><?php echo $key ?></li>
        <?php } ?>
    <?php } ?>
    </ul>
<?php } elseif ( $this->hasScalar ){ ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ){ ?>
    <p>Foo = Bar</p>
    <?php } ?>
<?php } else { ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ){ ?>
    <p>Spam</p>
    <?php } else { ?>  
    <p>Eggs</p>  
    <?php } ?>
<?php } ?>

Isso é especialmente útil para instruções de controle longas, nas quais talvez você não consiga ver a declaração superior da chave inferior.

Harry Mustoe-Playfair
fonte
7

Eu acho que realmente depende do seu estilo de codificação pessoal. Se você está acostumado a C ++, Javascript etc., pode se sentir mais confortável usando a sintaxe {}. Se você está acostumado ao Visual Basic, convém usar o if: endif; sintaxe.

Não tenho certeza se alguém pode dizer definitivamente que um é mais fácil de ler do que o outro - é a preferência pessoal. Eu costumo fazer algo assim:

<?php
if ($foo) { ?>
   <p>Foo!</p><?php
} else { ?>
   <p>Bar!</p><?php
}  // if-else ($foo) ?>

Se é mais fácil ler do que:

<?php
if ($foo): ?>
   <p>Foo!</p><?php
else: ?>
   <p>Bar!</p><?php
endif; ?>

é uma questão de opinião. Eu posso ver por que alguns acham que a segunda maneira é mais fácil - mas apenas se você não estiver programando em Javascript e C ++ a vida toda. :)

livefree75
fonte
1
Não, os colchetes são objetivamente mais fáceis de ler (quando não se usa a versão egípcia). Mesmo se você estiver usando os colchetes de forma que eles andem como um egípcio, é mais fácil ler do que a sintaxe VB, porque os editores de texto modernos terão uma função de correspondência de colchetes para levá-lo da abertura para o colchete de fechamento ou o contrário. Não há como eles terem uma função de correspondência de sintaxe VB. Além disso, você precisa aninhar e o VB falha miseravelmente nisso.
Developerwjk
5

Eu usaria a primeira opção, se possível, independentemente da nova opção. A sintaxe é padrão e todo mundo sabe disso. Também é compatível com versões anteriores.

Paulo
fonte
5

Ambos são iguais.

Mas: se você deseja usar o PHP como sua linguagem de modelagem nos arquivos de exibição (o V do MVC), pode usar esta sintaxe alternativa para distinguir entre o código php escrito para implementar a lógica de negócios (partes de MVC) e orientação. lógica. Claro que não é obrigatório e você pode usar a sintaxe que desejar.

A ZF usa essa abordagem.

Itay Moav-Malimovka
fonte
5

Não há diferença técnica entre as duas sintaxes. A sintaxe alternativa não é nova; foi suportado pelo menos desde o PHP 4, e talvez até mais cedo.

Você pode preferir o formulário alternativo, porque afirma explicitamente qual estrutura de controle está terminando: endwhilepor exemplo, pode terminar apenas um whilebloco, enquanto que, se você encontrar um colchete, ele poderá fechar qualquer coisa.

Você pode preferir a sintaxe tradicional, se usar um editor que tenha suporte especial para chaves em outras sintaxes do tipo C. O Vim, por exemplo, suporta várias pressionamentos de teclas para navegar para chaves correspondentes e para o início e o fim de blocos delimitados por chave. A sintaxe alternativa quebraria esse recurso do editor.

Rob Kennedy
fonte
3

No final, você simplesmente não quer procurar a seguinte linha e depois adivinhar onde começou:

<?php } ?>

Tecnicamente e funcionalmente, eles são os mesmos.

Bondt
fonte
1
Um bom editor de texto terá um atalho de correspondência entre parênteses para levá-lo para onde começou. Sua endif;que vai ser difícil encontrar o começo para, porque eles não têm uma função semelhante para isso, e código VB-estilo não ninho bem.
Developerwjk
3

Tudo depende. Pessoalmente, prefiro a sintaxe tradicional com ecos e muitos recuos, pois é muito mais fácil de ler.

<?php
    if($something){
        doThis();
    }else{
        echo '<h1>Title</h1>
            <p>This is a paragraph</p>
            <p>and another paragraph</p>';
    }
?>

Concordo que a sintaxe alt é mais limpa com as diferentes cláusulas finais, mas eu realmente tenho dificuldade em lidar com elas sem a ajuda do destaque do editor de texto, e não estou acostumado a ver código "condensado" como este:

<?php if( $this->isEnabledViewSwitcher() ): ?>
<p class="view-mode">
    <?php $_modes = $this->getModes(); ?>
    <?php if($_modes && count($_modes)>1): ?>
    <label><?php echo $this->__('View as') ?>:</label>
    <?php foreach ($this->getModes() as $_code=>$_label): ?>
        <?php if($this->isModeActive($_code)): ?>
            <strong title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></strong>&nbsp;
        <?php else: ?>
            <a href="<?php echo $this->getModeUrl($_code) ?>" title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></a>&nbsp;
        <?php endif; ?>
    <?php endforeach; ?>
    <?php endif; ?>
</p>
<?php endif; ?>
Yi Yang
fonte
2

Eu costumava usar os chavetas, mas hoje em dia eu prefiro usar essa sintaxe alternativa de mão curta devido à legibilidade e acessibilidade do código.


fonte
Eu o uso nos meus modelos de exibição.
alex
2

Pessoalmente, prefiro fazê-lo em duas seções separadas, mas dentro do mesmo PHP, como:

<?php 
    if (question1) { $variable_1 = somehtml; }
    else { $variable_1 = someotherhtml; } 

    if (question2) {
        $variable_2 = somehtml2;
    }

    else { 
        $variable_2 = someotherhtml2;
    }         

etc.
$output=<<<HERE
htmlhtmlhtml$variable1htmlhtmlhtml$varianble2htmletcetcetc
HERE;
echo $output;

?>

Mas talvez seja mais lento?

henrik
fonte
1

Eu acho que é uma questão de preferência. Eu pessoalmente uso:

if($something){
       $execute_something;
}
Sergio Rodriguez
fonte
1
se você leu o tópico inteiro: sintaxe alternativa é preferida e muito <em> mais limpa </em> ao modelar ou usar o idioma estrangeiro nos
modos de exibição
1

Eu costumava usar colchetes para condições "if, else". No entanto, eu encontrei "if (xxx): endif;" é mais semântico se o código estiver muito encapsulado e mais fácil de ler em qualquer editor.

Naturalmente, muitos editores são capazes de reconhecer e destacar trechos de código quando colchetes são selecionados. Alguns também se saem bem no par "if (xxx): endif" (por exemplo, NetBeans)

Pessoalmente, eu recomendaria "if (xxx): endif", mas para verificação de condição pequena (por exemplo, apenas uma linha de código), não há muitas diferenças.

Aaron Chen
fonte
1

Sinto que nenhuma das respostas preexistentes identifica completamente a resposta aqui, então vou articular minha própria perspectiva. Funcionalmente, os dois métodos são os mesmos. Se o programador estiver familiarizado com outros idiomas seguindo a sintaxe C, provavelmente se sentirá mais confortável com o aparelho, ou se o php for o primeiro idioma que estiver aprendendo, ele se sentirá mais confortável com a if endifsintaxe, pois parece mais próximo para linguagem regular.

Se você é um programador realmente sério e precisa fazer as coisas com rapidez, acredito que a sintaxe entre chaves é superior porque economiza tempo ao digitar

if(/*condition*/){
    /*body*/ 
}

comparado com

if(/*condition*/):
    /*body*/
endif;

Isto é especialmente verdade com outros loops, digamos, foreachonde você acabaria digitando 10 caracteres extras. Com chaves, você só precisa digitar dois caracteres, mas para a sintaxe baseada em palavras-chave, você precisa digitar uma palavra-chave extra inteira para cada loop e declaração condicional.

Andrew
fonte