Todo el mundo se encuentra con errores de sintaxis. Incluso los programadores experimentados cometen errores. Para los recién llegados, esto forma parte del proceso de aprendizaje. Sin embargo, a menudo es fácil interpretar los mensajes de error como: PHP Parse error: syntax error, unexpected '{' in index.php on line 20 El símbolo inesperado no es siempre el verdadero culpable. Pero el número de línea da una idea aproximada de dónde empezar a buscar. Mire siempre el contexto del código. El error de sintaxis a menudo se esconde en el mencionado o en líneas de código anteriores. Compara tu código con los ejemplos de sintaxis del manual. Aunque no todos los casos coinciden con los demás. Sin embargo, hay algunos pasos generales para resolver errores de sintaxis. Esta referencia resume los errores más comunes:
{<br>Inesperado
}<br>Inesperado
(<br>Inesperado
)`[
]
<
>
,
(coma)
.
(punto)
;
(punto y coma)*
(asterisco):
(dos puntos)
Referencias estrechamente relacionadas:""
inteligentes ''
no significan nada para PHP
Y:**Por último, considere que si el error de sintaxis no se produjo al editar su código base, sino después de la instalación o actualización de un paquete de un proveedor externo, podría deberse a la incompatibilidad de la versión de PHP, así que compruebe los requisitos del proveedor con la configuración de su plataforma.
PHP pertenece a los lenguajes de programación estilo C e imperativo. Tiene reglas gramaticales rígidas, de las que no puede recuperarse cuando encuentra símbolos o identificadores mal colocados. No puede adivinar sus intenciones de codificación.
Hay algunas precauciones básicas que siempre puedes tomar:
Un típico mensaje de error de sintaxis dice
Error de análisis: error de sintaxis, inesperado T_STRING, esperando ';
' en file.php en línea 217
Que enumera la posible ubicación de un error de sintaxis. Ver el mencionado nombre de archivo y número de línea.
Un moniker como T_STRING
explica qué símbolo el parser/tokenizador no pudo procesar finalmente. Sin embargo, esto no es necesariamente la causa del error de sintaxis.
Es importante mirar también las líneas de código anteriores. A menudo, los errores de sintaxis son sólo percances que ocurrieron antes. El número de la línea de error es sólo donde el analizador sintáctico se dio por vencido para procesarlo todo.
Hay muchos enfoques para reducir y arreglar los contratiempos de sintaxis.
;
en los finales de línea/afirmación anteriores. (Al menos desde el punto de vista estilístico. ){}
están incorrectamente cerrados o anidados, puede que tenga que investigar aún más arriba en el código fuente. Utilice la sangría apropiada del code para simplificar eso.+-*/.
también deberían tener colores distintos. Si no, podrían estar en el contexto equivocado."o
'que no ha sido capturado.++
, --
, o paréntesis después de un operador. Dos cadenas/identificadores directamente seguidos son incorrectos en la mayoría de los contextos.si
en condiciones si
distintas o anidadas.? :
puede compactar el código y es muy útil. Pero no ayuda a la legibilidad en todos los casos. Prefiera las sentencias if
simples mientras no esté versado.if:
/elseif:
/endif;
) es común para las plantillas, pero podría decirse que es menos fácil de seguir que los bloques normales de {código
}`.;
para terminar las sentencias/líneas."o
'` y comillas sin esconder dentro..
.(
paréntesis )
. Cuéntelos en la línea reportada. ¿Hay un número igual de ellos?grep --color -P -n "|[\x80-\xFF]" file.php
como primera medida para encontrar símbolos no ASCII.//
o #
. Los comentarios multilínea /*...*/
rara vez molestan al analizador cuando se ignoran los saltos de línea.php -v
para el intérprete de la línea de comandos<?php phpinfo();
para el invocado a través del servidor web.
No son necesariamente lo mismo. En particular, cuando se trabaja con frameworks, los harás coincidir.Si su sitio web está simplemente en blanco, entonces típicamente un error de sintaxis es la causa. Habilite su visualización con:
error_reporting = E_ALL
display_errors = 1
En su php.ini
generalmente, o a través de .htaccess
para mod_php,
o incluso .user.ini
con configuraciones FastCGI.
Habilitarlo dentro del script roto es demasiado tarde porque PHP ni siquiera puede interpretar/ejecutar la primera línea. Una solución rápida es crear un script envolvente, por ejemplo test.php
:<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include("./broken-script.php");
Entonces invoca el código que falla accediendo a este script envolvente.
También ayuda activar el error_log
de PHP y mirar en su servidor web's error.log
cuando un script falla con respuestas HTTP 500.
Un "inesperado T_VARIABLE
" significa que hay un nombre literal de $variable
, que no encaja en la estructura de la expresión/declaración actual.
Lo más común es que indique un punto y coma faltante en la línea anterior. Las asignaciones de variables que siguen a una sentencia son un buen indicador de dónde buscar:
⇓
func1()
$var = 1 + 2; # error de análisis en la línea +2
Un error frecuente son las concatenaciones de cadenas con el operador .
olvidado:
⇓
print "Aquí viene el valor: " $valor;
Por cierto, deberías preferir interpolación de cadenas (variables básicas entre comillas dobles) siempre que eso ayude a la legibilidad. Lo que evita estos problemas de sintaxis.
La interpolación de cadenas es una característica fundamental del lenguaje de programación. No hay que avergonzarse de utilizarla. Ignore cualquier consejo de micro-optimización sobre que la concatenación de variables .
es más rápida. **No lo es.
Por supuesto, el mismo problema puede surgir en otras expresiones, por ejemplo las operaciones aritméticas:
⇓
print 4 + 7 $var;
PHP no puede adivinar aquí si la variable debería haber sido sumada, restada o comparada, etc.
Lo mismo para las listas de sintaxis, como en las poblaciones de array, donde el analizador sintáctico también indica una coma esperada ,
por ejemplo:
⇓
$var = array("1" => $val, $val2, $val3 $val4);
O listas de parámetros de funciones:
⇓
function myfunc($param1, $param2 $param3, $param4)
De forma equivalente se ve esto con declaraciones list
o global
, o cuando falta un ;
punto y coma en un bucle for
.
Este error del analizador sintáctico también se produce [en las declaraciones de clase] (https://stackoverflow.com/questions/5122729/im-getting-a-syntax-error-unexpected-t-variable-error-i-dont-see-what-im). Sólo se pueden asignar constantes estáticas, no expresiones. Por lo tanto, el analizador sintáctico se queja de las variables como datos asignados:
clase xyz { ⇓
var $value = $_GET["input"];
Las llaves de cierre }
no emparejadas pueden, en particular, llevar a esto. Si un método se termina demasiado pronto (¡utiliza una sangría adecuada!), entonces una variable extraviada es comúnmente mal colocada en el cuerpo de la declaración de la clase.
Tampoco puedes hacer que una variable siga a un identificador directamente:
⇓
$this->myFunc$VAR();
Por cierto, este es un ejemplo común en el que la intención era utilizar variables variables tal vez. En este caso una búsqueda de propiedades variables con $this->{"myFunc$VAR"}();
por ejemplo.
Tenga en cuenta que el uso de variables variables debe ser la excepción. Los recién llegados a menudo tratan de usarlas demasiado casualmente, incluso cuando las matrices serían más simples y apropiadas.
La escritura apresurada puede llevar a olvidar los paréntesis de apertura
para las sentencias if
y for
y foreach
:
⇓
foreach $array as $key) {
Solución: añadir la apertura (
que falta entre la sentencia y la variable.
⇓
else ($var >= 0)
Solución: Eliminar las condiciones de else
o utilizar elseif
.
⇓
function() usa $var {}
Solución: Añadir paréntesis alrededor de $var
.
Como se menciona en la respuesta de referencia sobre "Invisible stray Unicode" (como un espacio sin romper), también puede ver este error para el código desprevenido como:
<?php
⇐
$var = new PDO(...);
Es bastante frecuente en el inicio de los archivos y en el código copiado y pegado. Compruebe con un editor hexadecimal, si su código no parece visualmente contener un problema de sintaxis.
T_STRING
es un nombre un poco erróneo. No se refiere a una `"cadena" entrecomillada. Significa que se ha encontrado un identificador sin procesar. Esto puede variar desde palabras "vacías" hasta restos de "CONSTANTES" o nombres de funciones, cadenas olvidadas sin citar, o cualquier texto sin formato.
"
entonces un error de sintaxis típicamente se materializa después. Una cadena no terminada a menudo consumirá un poco de código hasta el siguiente valor de cadena previsto:
⇓
echo "Algún texto", $a_variable, "y alguna cadena sin terminar";
éxito("terminado");
⇯
No es sólo literal T_STRING
s que el parser puede protestar entonces. Otra variación frecuente es un Unexpected '>'
para HTML literal no citado.<?xml
cabeceras en scripts PHP