Falta {
o }
debido a una sangría incorrecta
Las llaves de código que no coinciden son comunes a código menos formateado 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){
Si su código se ve así, ¡comience de nuevo! De lo contrario, no se puede arreglar para ti ni para nadie más. No tiene sentido mostrar esto en Internet para pedir ayuda.
Solo podrá solucionarlo si puede seguir visualmente la estructura anidada y la relación de los condicionales if / else y sus {
bloques de código }
. Use su IDE para ver si están todos emparejados.
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
Cualquier doble }
}
no solo cerrará una rama, sino una estructura de condición previa. Por lo tanto, quédate con un estilo de codificación; no mezcle y combine en árboles if / else anidados.
Además de la consistencia aquí, resulta útil para evitar condiciones prolongadas también. Utilice variables o funciones temporales para evitar if
expresiones ilegibles .
IF
no se puede usar en expresiones
Un error sorprendentemente frecuente de los recién llegados es tratar de usar una if
declaración en una expresión, como una declaración impresa:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
Lo cual no es válido, por supuesto.
Puede usar un condicional ternario , pero tenga cuidado con los impactos de legibilidad.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
De lo contrario, rompa tales construcciones de salida: use múltiples if
sy echo
s .
Mejor aún, use variables temporales y coloque sus condicionales antes:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
La definición de funciones o métodos para tales casos a menudo también tiene sentido.
Los bloques de control no devuelven "resultados"
Ahora esto es menos común, pero algunos codificadores incluso tratan de tratar if
como si pudiera devolver un resultado :
$var = if ($x == $y) { "true" };
Que es estructuralmente idéntico al uso if
dentro de una concatenación / expresión de cadena.
- Pero las estructuras de control (if / foreach / while) no tienen un "resultado" .
- La cadena literal "verdadero" también sería una declaración nula.
Tendrás que usar una tarea en el bloque de código :
if ($x == $y) { $var = "true"; }
Alternativamente, recurra a una ?:
comparación ternaria.
Si en si
Usted no puede un nidoif
dentro de una condición ya sea:
⇓
if ($x == true and (if $y != false)) { ... }
Lo que obviamente es redundante, porque and
(o or
) ya permite encadenar comparaciones.
;
Punto y coma olvidado
Una vez más: cada bloque de control debe ser una declaración. Si el código anterior no termina con un punto y coma, entonces ese es un error de sintaxis garantizado:
⇓
$var = 1 + 2 + 3
if (true) { … }
Por cierto, la última línea en un {…}
bloque de código también necesita un punto y coma.
Punto y coma demasiado temprano
Ahora probablemente sea incorrecto culpar a un estilo de codificación en particular, ya que esta trampa es demasiado fácil de pasar por alto:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
Lo que sucede con más frecuencia de lo que puedas imaginar.
- Cuando termina la
if ()
expresión con;
ella, se ejecutará una declaración nula. ¡El se ;
convierte en un vacío {}
propio!
- El
{…}
bloque, por lo tanto, se separa del if
, y siempre se ejecutará.
- Por lo tanto,
else
ya no tenía una relación con una if
construcción abierta , por lo que esto conduciría a un error de sintaxis T_ELSE inesperado.
Lo que también explica una variación igualmente sutil de este error de sintaxis:
if ($x) { x_is_true(); }; else { something_else(); };
Donde ;
después del bloque de código {…}
termina la if
construcción completa , cortando la else
rama sintácticamente.
No usar bloques de código
Está sintácticamente permitido omitir llaves {
... }
para bloques de código en if
/ elseif
/ else
ramas. Que lamentablemente es un estilo de sintaxis muy común para los codificadores no invertidos. (Bajo el supuesto falso, esto fue más rápido de escribir o leer).
Sin embargo, es muy probable que dispare la sintaxis. Tarde o temprano, declaraciones adicionales encontrarán su camino en las ramas if / else:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
Pero para usar bloques de código, ¡tienes que escribirlos {
... }
como tales!
Incluso los programadores experimentados evitan esta sintaxis sin llaves, o al menos la entienden como una excepción excepcional a la regla.
Else / Elseif en orden incorrecto
Una cosa para recordar es el orden condicional , por supuesto.
if ($a) { … }
else { … }
elseif ($b) { … }
↑
Puede tener tantos elseif
s como desee, pero else
tiene que ir al final . Así es como es.
Declaraciones de clase
Como se mencionó anteriormente , no puede tener declaraciones de control en una declaración de clase:
class xyz {
if (true) {
function ($var) {}
}
O bien olvidó una definición de función , o cerró una }
demasiado pronto en tales casos.
Inesperado T_ELSEIF / T_ELSE
Al mezclar PHP y HTML, el cierre }
para un if/elseif
debe estar en el mismo bloque PHP <?php ?>
que el siguiente elseif/else
. Esto generará un error ya que el cierre }
de las if
necesidades debe ser parte de elseif
:
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
La forma correcta <?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
Esto es más o menos una variación de sangría incorrecta, probablemente basada en intenciones de codificación incorrectas.
No puede mezclar otras declaraciones intermedias if
y elseif
/ o else
tokens estructurales:
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
O bien solo puede ocurrir en {…}
bloques de código, no entre tokens de estructura de control.
- Esto no tendría sentido de todos modos. No es que hubiera un estado "indefinido" cuando PHP salta entre
if
y se else
bifurca.
- Tendrá que decidir dónde pertenecen las declaraciones de impresión / o si deben repetirse en ambas ramas.
Tampoco puede separar un if / else entre diferentes estructuras de control:
foreach ($array as $i) {
if ($i) { … }
}
else { … }
No existe una relación sintáctica entre if
y else
. El foreach
alcance léxico termina en }
, por lo que no tiene sentido que la if
estructura continúe.
T_ENDIF
Si se queja un T_ENDIF inesperado, está utilizando el estilo de sintaxis alternativo if:
⋯ elseif:
⋯ else:
⋯ endif;
. En lo que realmente deberías pensar dos veces.
Un error común es confundir el colon misteriosamente similar :
para un ;
punto y coma . (Cubierto en "Punto y coma demasiado temprano")
Como la sangría es más difícil de rastrear en los archivos de plantilla, más cuando se usa la sintaxis alternativa: es plausible endif;
que no coincida con ninguna if:
.
El uso } endif;
es un terminador doble if
.
Mientras que un "final inesperado de $" suele ser el precio de una }
llave de cierre olvidada .
Asignación versus comparación
Entonces, este no es un error de sintaxis, pero vale la pena mencionarlo en este contexto:
⇓
if ($x = true) { }
else { do_false(); }
Eso no es un ==
/ ===
comparación, sino una =
asignación . Esto es bastante sutil, y llevará fácilmente a algunos usuarios a editar impotentes bloques de condiciones completas. Tenga cuidado con las tareas no intencionadas primero, siempre que experimente un error lógico / mal comportamiento.