Errores de parse/sintaxis de PHP; y cómo resolverlos
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:
- T_STRING inesperado
- T_VARIABLE inesperada
Inesperada '$varname' (T_VARIABLE) - Inesperado T_CONSTANT_ENCAPSED_STRING
Inesperado T_ENCAPSED_AND_WHITESPACE - Inesperado $end
- Inesperado T_FUNCTION...
- Inesperado
{<br>Inesperado
}<br>Inesperado
(<br>Inesperado
)` - Inesperado
[
Inesperado]
- Inesperado T_IF
Inesperado T_FOREACH
Inesperado T_FOR
Inesperado T_WHILE
Inesperado T_DO
Inesperado T_PRINT
Inesperado T_ECHO - Inesperado T_LNUMBER](//stackoverflow.com/a/47202089)
- Inesperado ?](//stackoverflow.com/a/48670368)
- Unexpected continue (T_CONTINUE)
Unexpected continue (T_BREAK)
Unexpected continue (T_RETURN) - Inesperado '='
- T_INLINE_HTML](https://stackoverflow.com/questions/4934754/t-inline-html-whats-wrong-with-this)...
- Inesperado T_PAAMAYIM_NEKUDOTAYIM](https://stackoverflow.com/questions/1966010/what-does-this-mean-parse-error-syntax-error-unexpected-t-paamayim-nekudotay)...
- Inesperado T_OBJECT_OPERATOR](https://stackoverflow.com/questions/3990212/help-with-this-error-message-unexpected-t-object-operator)...
- Inesperado T_DOUBLE_ARROW... valores de array no terminados , https://stackoverflow.com/questions/12980794/parse-error-syntax-error-unexpected-t-double-arrow-in-line-1059 -->
- Inesperado T_SL...
- Inesperado T_BOOLEAN_OR...
Inesperado T_BOOLEAN_AND... - Inesperado T_IS_EQUAL
Inesperado T_IS_GREATER_OR_EQUAL
Inesperado T_IS_IDENTICAL
Inesperado T_IS_NOT_EQUAL
Inesperado T_IS_NOT_IDENTICAL
Inesperado T_IS_SMALLER_OR_EQUAL
Inesperado<
Inesperado>
- Inesperado T_NS_SEPARATOR...
- Carácter inesperado en la entrada: '`\N#39; (ASCII=92) state=1
- Inesperado 'public' (T_PUBLIC)
Inesperado 'private' (T_PRIVATE)
Inesperado 'protected' (T_PROTECTED)
Inesperado 'final' (T_FINAL)... - Inesperado T_STATIC...
- T_CLASS inesperado...
- T_DNUMBER inesperado
- Inesperado
,
(coma) - Inesperado
.
(punto) - Inesperado
;
(punto y coma) - Inesperado
*
(asterisco) - Inesperado
:
(dos puntos) Referencias estrechamente relacionadas: - ¿Qué significa este error en PHP? (errores de ejecución)
- Error de análisis: error de sintaxis, T_XXX inesperado](https://stackoverflow.com/questions/12769982/reference-what-does-this-error-mean-in-php/12770089/#12770089)
- Error de análisis: error de sintaxis, inesperado T_ENCAPSED_AND_WHITESPACE](https://stackoverflow.com/questions/12769982/reference-what-does-this-error-mean-in-php/13935532#13935532)
- Error de análisis: error de sintaxis, T_VARIABLE inesperada](https://stackoverflow.com/questions/12769982/reference-what-does-this-error-mean-in-php/15539535#15539535)
- ¿Qué significa este símbolo en PHP? (tokens del lenguaje)](https://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php)
- Esas comillas
""
inteligentes''
no significan nada para PHP Y:
- El manual de PHP en php.net y sus diversos tokens de lenguaje
- O Wikipedia's introducción de sintaxis en PHP.
- Y por último nuestro php tag-wiki por supuesto. Aunque Stack Overflow también da la bienvenida a los codificadores novatos, está dirigido principalmente a preguntas de programación profesional.
- Responder a los errores de codificación de todo el mundo y a los errores tipográficos se considera principalmente fuera de tema.
- Así que, por favor, tómate el tiempo de seguir los [pasos básicos] (https://stackoverflow.com/a/18050072), antes de publicar solicitudes de corrección de sintaxis.
-
Si todavía tiene que hacerlo, por favor muestre su propia iniciativa de solución, intentos de arreglos, y su proceso de pensamiento sobre lo que parece o podría estar mal. Si su navegador muestra mensajes de error como "SyntaxError: illegal character", entonces no está relacionado con [tag:php], sino con [tag:javascript]-syntax error.
**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.
¿Qué son los errores de sintaxis?
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.
Consejos más importantes
Hay algunas precauciones básicas que siempre puedes tomar:
Cómo interpretar los errores del analizador sintáctico
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 comoT_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.Resolver errores de sintaxis
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 condicionessi
distintas o anidadas.? :
puede compactar el código y es muy útil. Pero no ayuda a la legibilidad en todos los casos. Prefiera las sentenciasif
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.Pantalla blanca de la muerte
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 suphp.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 ejemplotest.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'serror.log
cuando un script falla con respuestas HTTP 500.Inesperado T_VARIABLE
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.Falta punto y coma
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:
Concatenación de cadenas
Un error frecuente son las concatenaciones de cadenas con el operador
.
olvidado: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.Faltan operadores de expresión
Por supuesto, el mismo problema puede surgir en otras expresiones, por ejemplo las operaciones aritméticas:
PHP no puede adivinar aquí si la variable debería haber sido sumada, restada o comparada, etc.
Listas
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:O listas de parámetros de funciones:
De forma equivalente se ve esto con declaraciones
list
oglobal
, o cuando falta un;
punto y coma en un buclefor
.Declaraciones de clase
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:
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.Variables después de identificadores
Tampoco puedes hacer que una variable siga a un identificador directamente:
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.
Faltan paréntesis después de las construcciones del lenguaje
La escritura apresurada puede llevar a olvidar los paréntesis de apertura para las sentencias
if
yfor
yforeach
:Solución: añadir la apertura
(
que falta entre la sentencia y la variable.Else no espera condiciones
Solución: Eliminar las condiciones de
else
o utilizarelseif
.Necesita paréntesis para el cierre
Solución: Añadir paréntesis alrededor de
$var
.Espacio en blanco invisible
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:
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.
Ver también
T_STRING inesperado
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.Cadenas mal citadas
Sin embargo, este error de sintaxis es más común para los valores de cadena mal citados. Cualquier comilla sin esconder y extraviada `"o `'formará una expresión no válida: ⇓ ⇓ echo "haga clic aquí"; El resaltado de sintaxis hará que estos errores sean súper obvios. Es importante recordar que hay que usar barras invertidas para escapar de las comillas dobles, o de las comillas simples, dependiendo de lo que se haya usado como [cierre de cadena][1]. - Por conveniencia, debería preferir las comillas simples externas cuando se imprime HTML plano con comillas dobles dentro. - Utilice cadenas con comillas dobles si quiere interpolar variables, pero entonces tenga cuidado con el escape de las comillas dobles literales `"`. - Para una salida más larga, prefiera múltiples líneas `echo`/`print` en lugar de escapar dentro y fuera. Mejor aún, considere una sección [HEREDOC][2]. Véase también *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*."
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 literalT_STRING
s que el parser puede protestar entonces. Otra variación frecuente es unUnexpected '>'
para HTML literal no citado.Comillas de cadena no programadas
Si *copias y pegas* código de un blog o sitio web, a veces acabas con código no válido. [Las comillas tipográficas no son][4] lo que espera PHP: $text = 'Algo algo..' + "estas no son comillas"; Las comillas tipográficas/inteligentes son símbolos Unicode. PHP las trata como parte del texto alfanumérico adyacente. Por ejemplo `"estos` se interpreta como un identificador constante. Pero cualquier literal de texto siguiente es visto entonces como una palabra desnuda/T_STRING por el parser.El punto y coma que falta; de nuevo
Si tiene una expresión sin terminar en las líneas anteriores, entonces cualquier declaración o construcción de lenguaje siguiente se ve como un identificador crudo: ⇓ func1() function2(); PHP simplemente no puede saber si quiere ejecutar dos funciones después de la otra, o si quiere multiplicar sus resultados, sumarlos, compararlos, o sólo ejecutar una `||` o la otra.Etiquetas abiertas cortas y
Esto es bastante infrecuente. Pero si short_open_tags está habilitado, entonces no podrá comenzar sus scripts PHP [con una declaración XML][5]: ⇓ <?xml version="1.0"?> PHP verá el `<?` y lo reclamará para sí mismo. No entenderá para qué sirve el "xml" extraviado. Se interpretará como una constante. Pero la "versión" será vista como otro literal/constante. Y dado que el analizador sintáctico no puede dar sentido a dos literales/valores subsiguientes sin un operador de expresión entre ellos, eso será un fallo del analizador sintáctico.<?xml
cabeceras en scripts PHPCaracteres Unicode invisibles
Una de las causas más horribles de los errores de sintaxis son los símbolos Unicode, como el [espacio sin romper][6]. PHP permite caracteres Unicode como nombres de identificadores. Si obtiene una queja del analizador T_STRING por un código totalmente insospechado como <?php imprime 123; Necesitas sacar otro editor de texto. O incluso un editor hexadecimal. Lo que parece espacios y líneas nuevas aquí, puede contener constantes invisibles. Los IDEs basados en Java a veces no se dan cuenta de un BOM UTF-8 malogrado dentro, espacios de ancho cero, separadores de párrafo, etc. Intenta reeditar todo, eliminar los espacios en blanco y volver a añadir espacios normales. Puedes reducirlo con la adición de separadores de declaración redundantes `;` en cada inicio de línea: <?php ;print 123; El punto y coma extra aquí convertirá el carácter invisible precedente en una referencia constante indefinida (expresión como declaración). Lo que a su vez hace que PHP produzca un aviso de ayuda.El signo `$` que falta delante de los nombres de las variables
[Las variables en PHP][7] se representan con un signo de dólar seguido del nombre de la variable. El signo del dólar (`$`) es un [sigil][8] que marca el identificador como nombre de una variable. Sin este signo, el identificador podría ser una [palabra clave del lenguaje][9] o una [constante][10]. Este es un error común cuando el código PHP fue ["traducido" de código escrito en otro lenguaje][11] (C, Java, JavaScript, etc.). En estos casos, una declaración del tipo de la variable (cuando el código original fue escrito en un lenguaje que utiliza variables tipadas) también podría colarse y producir este error.Comillas escapadas
Si usas `` en una cadena, tiene un significado especial. Se denomina "Carácter de escape][12]" y normalmente indica al analizador sintáctico que tome el siguiente carácter literalmente. Ejemplo: `echo 'Jim dijo 'Hola'';imprimirá `Jim dijo 'hola'`. Si se escapan las comillas de cierre de una cadena, las comillas de cierre se tomarán literalmente y no como se pretende, es decir, como comillas imprimibles como parte de la cadena y no cerrando la cadena. Esto se mostrará como un error de parseo comúnmente después de abrir la siguiente cadena o al final del script. Un error muy común cuando se especifican las rutas en Windows: `"C:xampp\htdocs"es incorrecto. Se necesita `"C:\xampp\htdocs\"`.