Falta {
ou }
devido a recuo incorreto
Chaves de código incompatíveis são comuns a códigos menos bem formatados, como:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
Se o seu código estiver assim, inicie novamente! Caso contrário, não poderá ser corrigido para você ou qualquer outra pessoa. Não faz sentido mostrar isso na internet para pedir ajuda.
Você só poderá corrigi-lo se puder seguir visualmente a estrutura e a relação aninhada das condicionais if / else e seus {
blocos de código }
. Use seu IDE para ver se todos estão emparelhados.
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
Qualquer duplo }
}
não apenas fechará uma ramificação, mas uma estrutura de condição anterior. Portanto, fique com um estilo de codificação; não misture e combine em árvores aninhadas if / else.
Além da consistência aqui, é útil evitar também condições demoradas. Use variáveis ou funções temporárias para evitar if
expressões ilegíveis .
IF
não pode ser usado em expressões
Um erro de iniciante surpreendentemente frequente está tentando usar uma if
declaração em uma expressão, como uma declaração impressa:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
O que é inválido, é claro.
Você pode usar um condicional ternário , mas cuidado com os impactos de legibilidade.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
Caso contrário quebrar tais construções de saída para cima: uso múltiplo if
s e echo
s .
Melhor ainda, use variáveis temporárias e coloque suas condicionais antes:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
Definir funções ou métodos para esses casos também costuma fazer sentido.
Blocos de controle não retornam "resultados"
Agora isso é menos comum, mas alguns codificadores tentam tratar if
como se isso pudesse retornar um resultado :
$var = if ($x == $y) { "true" };
O que é estruturalmente idêntico ao uso if
dentro de uma concatenação / expressão de string.
- Mas as estruturas de controle (se / foreach / while) não têm um "resultado" .
- A string literal "true" também seria apenas uma declaração nula.
Você precisará usar uma atribuição no bloco de código :
if ($x == $y) { $var = "true"; }
Como alternativa, recorra a uma ?:
comparação ternária.
Se em Se
Você não pode aninhar umif
dentro de uma condição:
⇓
if ($x == true and (if $y != false)) { ... }
O que é obviamente redundante, porque o and
(ou or
) já permite comparações de encadeamento.
;
Ponto e vírgula esquecido
Mais uma vez: Cada bloco de controle precisa ser uma declaração. Se o trecho de código anterior não terminar com ponto e vírgula, será um erro de sintaxe garantido:
⇓
$var = 1 + 2 + 3
if (true) { … }
Btw, a última linha em um {…}
bloco de código também precisa de um ponto e vírgula.
Ponto e vírgula muito cedo
Agora provavelmente está errado culpar um estilo de codificação específico, pois essa armadilha é muito fácil de ignorar:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
O que acontece com mais frequência do que você imagina.
- Quando você encerra a
if ()
expressão,;
ela executa uma declaração nula. O ;
torna-se um vazio {}
por si só!
- O
{…}
bloco, portanto, é desanexado do if
e sempre executado.
- Portanto,
else
não havia mais uma relação com uma if
construção aberta , e é por isso que isso levaria a um erro de sintaxe inesperado T_ELSE.
O que também explica uma variação igualmente sutil desse erro de sintaxe:
if ($x) { x_is_true(); }; else { something_else(); };
Onde o ;
bloco de código após {…}
finaliza toda a if
construção, cortando o else
ramo sintaticamente.
Não usando blocos de código
É sintaticamente permitido omitir chaves {
... }
para blocos de código em if
/ elseif
/ else
branches. Infelizmente, esse é um estilo de sintaxe muito comum para codificadores não-impressos. (Sob a falsa suposição, era mais rápido digitar ou ler).
No entanto, é altamente provável que ocorra a sintaxe. Mais cedo ou mais tarde, instruções adicionais encontrarão seu caminho para os ramos if / else:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
Mas para realmente usar blocos de código, você precisa escrevê- los {
... }
como tal!
Mesmo programadores experientes evitam essa sintaxe sem pulseira, ou pelo menos a entendem como uma exceção excepcional à regra.
Elseif / Elseif na ordem errada
Uma coisa a lembrar é a ordem condicional , é claro.
if ($a) { … }
else { … }
elseif ($b) { … }
↑
Você pode ter quantos elseif
s quiser, mas else
tem que ir por último . É assim mesmo.
Declarações de classe
Como mencionado acima , você não pode ter instruções de controle em uma declaração de classe:
class xyz {
if (true) {
function ($var) {}
}
Você esqueceu uma definição de função ou fechou uma }
muito cedo nesses casos.
T_ELSEIF / T_ELSE inesperado
Ao misturar PHP e HTML, o fechamento }
de um if/elseif
deve estar no mesmo bloco PHP <?php ?>
que o próximo elseif/else
. Isso gerará um erro, pois o fechamento }
das if
necessidades de fazer parte do elseif
:
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
A forma correta <?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
Isso é mais ou menos uma variação de indentação incorreta - presumivelmente com base em intenções de codificação incorretas.
Você não pode mascarar outras instruções entre if
e elseif
/ else
tokens estruturais:
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
Isso só pode ocorrer em {…}
blocos de código, não entre os tokens da estrutura de controle.
- Isso não faria sentido de qualquer maneira. Não é como se houvesse algum estado "indefinido" quando o PHP pulas entre
if
e else
branches.
- Você terá que decidir onde as instruções de impressão pertencem / ou se precisam ser repetidas nos dois ramos.
Você também não pode separar um if / else entre diferentes estruturas de controle:
foreach ($array as $i) {
if ($i) { … }
}
else { … }
Não há relação sintática entre o if
e else
. O foreach
escopo lexical termina em }
, então não há sentido para a if
estrutura continuar.
T_ENDIF
Se um T_ENDIF inesperado for reclamado, você estará usando o estilo de sintaxe alternativo if:
⋯ elseif:
⋯ else:
⋯ endif;
. O que você realmente deve pensar duas vezes.
Uma armadilha comum é confundir o cólon assustadoramente semelhante :
por um ;
ponto e vírgula . (Coberto em "Ponto e vírgula muito cedo")
Como o recuo é mais difícil de rastrear nos arquivos de modelo, mais ao usar a sintaxe alternativa - é plausível que você endif;
não corresponda a nenhum if:
.
O uso } endif;
é um terminador dobrado if
.
Enquanto um "fim inesperado de $" geralmente é o preço de uma }
chave de fechamento esquecida .
Tarefa versus comparação
Portanto, este não é um erro de sintaxe, mas vale a pena mencionar neste contexto:
⇓
if ($x = true) { }
else { do_false(); }
Isso não é um ==
/ ===
comparação, mas uma =
atribuição . Isso é bastante sutil e levará facilmente alguns usuários a editar impotentes blocos de condições inteiros. Cuidado com as atribuições não intencionais primeiro - sempre que ocorrer uma falha / mau comportamento lógico.