Todos se encuentran con errores de sintaxis. Incluso los programadores experimentados hacen errores tipográficos. Para los recién llegados, es solo parte del proceso de aprendizaje. Sin embargo, a menudo es fácil interpretar mensajes de error como:
Error de análisis de PHP: error de sintaxis, inesperado '{' en index.php en la línea 20
El símbolo inesperado no siempre es el verdadero culpable. Pero el número de línea da una idea aproximada de dónde empezar a buscar.
Siempre mira el contexto del código . El error de sintaxis a menudo se esconde en las líneas de código mencionadas o en las anteriores . Compare su código con ejemplos de sintaxis del manual.
Si bien no todos los casos coinciden con el otro. Sin embargo, hay algunos pasos generales para resolver errores de sintaxis . Estas referencias resumen los errores comunes:
Inesperado T_CONSTANT_ENCAPSED_STRING
Inesperado T_ENCAPSED_AND_WHITESPACEInesperado T_SL ...
Carácter inesperado en la entrada: '
\
' (ASCII = 92) estado = 1Inesperado
,
(coma)No exento
.
(período)Inesperado
;
(punto y coma)Inesperado
*
(asterisco)Inesperado
:
(colon)Inesperado
&
(referencia de tiempo de llamada)
Referencias estrechamente relacionadas:
- ¿Qué significa este error en PHP? (errores de tiempo de ejecución)
- ¿Qué significa este símbolo en PHP? (fichas de idioma)
- Esas citas
“”
inteligentes‘’
no significan nada para PHP
Y:
- El manual de PHP en php.net y sus diversos tokens de lenguaje
- O la introducción de la sintaxis de Wikipedia en PHP .
- Y finalmente nuestro php tag-wiki, por supuesto.
Si bien Stack Overflow también da la bienvenida a los codificadores novatos, está dirigido principalmente a preguntas de programación profesional.
- Contestar los errores de codificación de todos y los errores tipográficos estrechos se considera principalmente fuera de tema.
- Por lo tanto, tómese el tiempo para seguir los pasos básicos antes de publicar solicitudes de corrección de sintaxis.
- Si todavía tiene que hacerlo, muestre su propia iniciativa de resolución, intentos de reparación y su proceso de pensamiento sobre lo que parece o podría estar mal.
Si su navegador muestra mensajes de error como "SyntaxError: carácter ilegal", entonces en realidad no esphprelacionado, pero un javascript- error de sintaxis .
Errores de sintaxis generados en el código del proveedor: Finalmente, considere que si el error de sintaxis no se generó editando su base de código, pero después de la instalación o actualización de un paquete de proveedor externo, podría deberse a la incompatibilidad de la versión de PHP, así que verifique los requisitos del proveedor en su plataforma preparar.
fuente
T_IF / T_FOREACH / ...
bloqueo. Aunque quería compilar un resumen más personalizado para las preguntas IF / ELSE / ELSEIF.Respuestas:
¿Cuáles son los errores de sintaxis?
PHP pertenece al estilo C y los lenguajes de programación imperativos . Tiene reglas de gramática rígidas, de las cuales no puede recuperarse cuando encuentra símbolos o identificadores extraviados. No puede adivinar sus intenciones de codificación.
Consejos más importantes
Hay algunas precauciones básicas que siempre puede tomar:
Utilice una sangría de código adecuada o adopte cualquier estilo de codificación elevado. La legibilidad evita irregularidades.
Use un IDE o editor para PHP con resaltado de sintaxis . Lo que también ayuda con el paréntesis / equilibrio de paréntesis.
Lea la referencia del lenguaje y los ejemplos en el manual. Dos veces, para llegar a ser algo competente.
Cómo interpretar los errores del analizador
Un típico mensaje de error de sintaxis dice:
Que enumera la posible ubicación de un error de sintaxis. Vea el nombre del archivo mencionado y el número de línea .
Un apodo como el que
T_STRING
explica el símbolo que el analizador / tokenizador no pudo procesar finalmente. Sin embargo, esta no es necesariamente la causa del error de sintaxis.Es importante tener en cuenta las líneas de código anteriores también. A menudo, los errores de sintaxis son solo percances que ocurrieron antes. El número de línea de error es justo donde el analizador abandonó de manera concluyente para procesarlo todo.
Resolver errores de sintaxis
Hay muchos enfoques para reducir y corregir el hipo de la sintaxis.
Abra el archivo fuente mencionado. Mire la línea de código mencionada .
Para cadenas fuera de control y operadores extraviados, aquí es generalmente donde se encuentra al culpable.
Lea la línea de izquierda a derecha e imagine lo que hace cada símbolo.
Más regularmente también necesita mirar las líneas anteriores .
En particular, faltan
;
puntos y comas en los extremos / instrucciones de la línea anterior. (Al menos desde el punto de vista estilístico).Si los
{
bloques de código}
están cerrados o anidados incorrectamente, es posible que deba investigar aún más el código fuente. Use la sangría de código adecuada para simplificar eso.Mira la coloración de sintaxis !
Las cadenas, las variables y las constantes deben tener colores diferentes.
Los operadores también
+-*/.
deben estar teñidos de forma distinta. De lo contrario, podrían estar en el contexto equivocado.Si ve que la coloración de la cadena se extiende demasiado o demasiado corta, entonces ha encontrado un cierre
"
o'
marcador de cadena sin escape o faltante .Tener dos caracteres de puntuación del mismo color uno al lado del otro también puede significar problemas. Por lo general, los operadores están solitario si no lo es
++
,--
o paréntesis a continuación de un operador. Dos cadenas / identificadores que se siguen directamente entre sí son incorrectos en la mayoría de los contextos.El espacio en blanco es tu amigo . Sigue cualquier estilo de codificación.
Romper las largas colas temporalmente.
Puede agregar líneas nuevas libremente entre operadores o constantes y cadenas. El analizador concretará el número de línea para los errores de análisis. En lugar de mirar el código muy largo, puede aislar el símbolo de sintaxis perdido o fuera de lugar.
Divide las
if
declaraciones complejas enif
condiciones distintas o anidadas .En lugar de largas fórmulas matemáticas o cadenas lógicas, use variables temporales para simplificar el código. (Más legible = menos errores).
Agregar nuevas líneas entre:
Particionar bloques de código largos realmente ayuda a localizar el origen de los errores de sintaxis.
Comente el código ofensivo.
Si no puede aislar la fuente del problema, comience a comentar (y así eliminar temporalmente) los bloques de código.
Tan pronto como elimine el error de análisis, ha encontrado la fuente del problema. Mira más de cerca allí.
A veces, desea eliminar temporalmente los bloques completos de función / método. (En caso de llaves sin igual y código con sangría incorrecta).
Cuando no pueda resolver el problema de sintaxis, intente reescribir las secciones comentadas desde cero .
Como recién llegado, evite algunas de las construcciones de sintaxis confusas.
El
? :
operador de condición ternaria puede compactar código y es realmente útil. Pero no ayuda a la legibilidad en todos los casos. Prefieroif
declaraciones simples mientras no se invierte.La sintaxis alternativa de PHP (
if:
/elseif:
/endif;
) es común para las plantillas, pero podría decirse que es menos fácil de seguir que los bloques de{
código normales}
.Los errores más frecuentes de los recién llegados son:
Faltan puntos
;
y comas para terminar declaraciones / líneas.Comillas de cadena no coincidentes para
"
o'
y citas sin escape dentro.Operadores olvidados, en particular para la
.
concatenación de cadenas .(
Paréntesis desequilibrados)
. Contarlos en la línea reportada. ¿Hay un número igual de ellos?No olvide que resolver un problema de sintaxis puede descubrir el siguiente.
Si hace que un problema desaparezca, pero otros surgen en algún código a continuación, está en el camino correcto.
Si después de editar un nuevo error de sintaxis aparece en la misma línea, entonces su intento de cambio fue posiblemente un error. (Aunque no siempre).
Restaure una copia de seguridad del código que funcionaba anteriormente, si no puede arreglarlo.
diff
de la última y rota versión de trabajo. Lo que podría ser esclarecedor en cuanto a cuál es el problema de sintaxis.Caracteres Unicode extraviados invisibles : en algunos casos, debe usar un editor hexadecimal o un editor / visor diferente en su fuente. Algunos problemas no se pueden encontrar simplemente mirando su código.
Intente
grep --color -P -n "\[\x80-\xFF\]" file.php
como la primera medida para encontrar símbolos que no sean ASCII.En particular, las listas de materiales, los espacios de ancho cero o los espacios que no se rompen, y las comillas inteligentes regularmente pueden encontrar su camino en el código fuente.
Asegúrese de qué tipo de saltos de línea se guardan en los archivos.
PHP solo honra las \nnuevas líneas, no \rlos retornos de carro.
Lo que ocasionalmente es un problema para los usuarios de MacOS (incluso en OS X para editores mal configurados).
A menudo solo aparece como un problema cuando se usan una sola línea
//
o#
comentarios. Los/*...*/
comentarios de varias líneas rara vez molestan al analizador cuando se ignoran los saltos de línea.Si su error de sintaxis no se transmite por la web : sucede que tiene un error de sintaxis en su máquina. Pero publicar el mismo archivo en línea ya no lo exhibe. Lo que solo puede significar una de dos cosas:
¡Estás mirando el archivo equivocado!
O su código contenía invisible Unicode perdido (ver arriba). Puede averiguarlo fácilmente: simplemente copie su código del formulario web en su editor de texto.
Verifica tu versión de PHP . No todas las construcciones de sintaxis están disponibles en todos los servidores.
php -v
para el intérprete de línea de comando<?php phpinfo();
para el invocado a través del servidor web.Esos no son necesariamente lo mismo. En particular, cuando trabaje con frameworks, los hará coincidir.
No use las palabras clave reservadas de PHP como identificadores para funciones / métodos, clases o constantes.
La prueba y error es su último recurso.
Si todo lo demás falla, siempre puede googlear su mensaje de error. Los símbolos de sintaxis no son tan fáciles de buscar (el desbordamiento de pila en sí mismo está indexado por SymbolHound ). Por lo tanto, puede tomar algunas páginas más antes de encontrar algo relevante.
Otras guías:
Pantalla blanca de la muerte
Si su sitio web está en blanco, la causa suele ser un error de sintaxis. Habilite su visualización con:
error_reporting = E_ALL
display_errors = 1
En
php.ini
general, o a través.htaccess
de 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 de envoltura, por ejemplo
test.php
:Luego invoque el código anómalo accediendo a este script de contenedor.
También ayuda a habilitar PHP
error_log
y buscar en su servidor weberror.log
cuando un script se bloquea con las respuestas HTTP 500.fuente
error_reporting(E_ALL | E_STRICT);
para versiones anteriores de PHPCreo que este tema es totalmente discutido / complicado. Usar un IDE es EL camino a seguir para evitar completamente cualquier error de sintaxis. Incluso diría que trabajar sin un IDE es poco profesional. ¿Por qué? Porque los IDEs modernos verifican su sintaxis después de cada carácter que escribe. Cuando codifica y toda su línea se vuelve roja, y un gran aviso de advertencia le muestra el tipo exacto y la posición exacta del error de sintaxis, entonces no hay absolutamente ninguna necesidad de buscar otra solución.
Usar un IDE de verificación de sintaxis significa:
(Efectivamente) nunca volverá a encontrar errores de sintaxis, simplemente porque los ve justo mientras escribe. Seriamente.
Excelentes IDEs con verificación de sintaxis (todos están disponibles para Linux, Windows y Mac):
fuente
Inesperado
[
En estos días, el
[
soporte de matriz inesperado se ve comúnmente en versiones obsoletas de PHP. La sintaxis de matriz corta está disponible desde PHP > = 5.4 . Las instalaciones más antiguas solo son compatiblesarray()
.La desreferenciación de resultados de la función de matriz tampoco está disponible para versiones anteriores de PHP:
Referencia: ¿qué significa este error en PHP? - "Error de sintaxis, inesperado
\[
" muestra las soluciones más comunes y prácticas.Sin embargo, siempre es mejor simplemente actualizar su instalación de PHP. Para planes de alojamiento web compartido, primero investigue si, por ejemplo,
SetHandler php56-fcgi
se puede usar para habilitar un tiempo de ejecución más nuevo.Ver también:
Por cierto, también hay preprocesadores y convertidores descendentes de sintaxis PHP 5.4 si realmente te apegas a las versiones PHP más antiguas y más lentas.
Otras causas de errores de sintaxis inesperados
[
Si no es la falta de coincidencia de la versión de PHP, a menudo es un error tipográfico simple o un error de sintaxis recién llegado:
No puede usar declaraciones / expresiones de propiedades de matriz en clases , ni siquiera en PHP 7.
Confundir
[
con la apertura de llaves{
o paréntesis(
es un descuido común.O incluso:
O tratando de desreferenciar constantes (antes de PHP 5.6) como matrices:
Al menos PHP interpreta eso
const
como un nombre constante.Si desea acceder a una variable de matriz (que es la causa típica aquí), agregue el
$
sigilo inicial, de modo que se convierta en a$varname
.Está intentando utilizar la
global
palabra clave en un miembro de una matriz asociativa. Esta no es una sintaxis válida:Inesperado
]
cierre de corchetesEsto es algo más raro, pero también hay accidentes de sintaxis con el
]
soporte de matriz de terminación .Una vez más, los desajustes con
)
paréntesis o}
llaves son comunes:O tratando de terminar una matriz donde no hay una:
Que a menudo ocurre en declaraciones de matriz anidadas y de varias líneas .
Si es así, use su IDE para la coincidencia de paréntesis para encontrar cualquier
]
cierre de matriz prematuro . Como mínimo, use más espacio y nuevas líneas para reducirlo.fuente
T_VARIABLE inesperado
Un "inesperado
T_VARIABLE
" significa que hay un$variable
nombre literal , que no se ajusta a la estructura actual de expresión / declaración.Falta el punto y coma
Más comúnmente indica un punto y coma faltante en la línea anterior. Las asignaciones variables después de una declaración 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, debe preferir la interpolación de cadenas (variables básicas entre comillas dobles) siempre que eso ayude a la legibilidad. Lo que evita estos problemas de sintaxis.
Operadores de expresión faltantes
Por supuesto, el mismo problema puede surgir en otras expresiones, por ejemplo, operaciones aritméticas:
PHP no puede adivinar aquí si la variable debería haberse agregado, restado o comparado, etc.
Liza
Lo mismo para las listas de sintaxis, como en las poblaciones de matriz, donde el analizador también indica una coma esperada,
,
por ejemplo:O listas de parámetros de funciones:
Equivalentemente ves esto con
list
oglobal
declaraciones, o cuando falta un;
punto y coma en unfor
bucle.Declaraciones de clase
Este error del analizador también se produce en las declaraciones de clase . Solo puede asignar constantes estáticas, no expresiones. Por lo tanto, el analizador se queja de las variables como datos asignados:
Las
}
llaves rizadas de cierre inigualables pueden conducir aquí en particular. Si un método se termina demasiado pronto (¡use la sangría adecuada!), Entonces una variable perdida se extravía comúnmente en el cuerpo de declaración de clase.Variables después de identificadores
Tampoco puede hacer que una variable siga un identificador directamente:
Por cierto, este es un ejemplo común donde la intención era usar variables variables tal vez. En este caso, una búsqueda de propiedad variable con,
$this->{"myFunc$VAR"}();
por ejemplo.Faltan paréntesis después de las construcciones del lenguaje
Tipificación precipitada puede dar lugar a la apertura o el cierre de paréntesis olvidado de
if
yfor
yforeach
declaraciones:Solución: agregue la abertura que falta
(
entre la instrucción y la variable.La
{
llave no abre el bloque de código, sin cerrar primero laif
expresión con el)
paréntesis de cierre.Lo demás no espera condiciones
Solución: elimine las condiciones
else
o el usoelseif
.Necesita soportes para el cierre
Solución: agregue corchetes alrededor
$var
.Espacio en blanco invisible
Como se menciona en la respuesta de referencia sobre "Unicode parásito invisible" (como un espacio que no se rompe ), también puede ver este error para código desprevenido como:
Es bastante frecuente en el inicio de los archivos y para el código copiado y pegado. Consulte con un editor hexadecimal si su código no parece contener visualmente un problema de sintaxis.
Ver también
fuente
Inesperado T_CONSTANT_ENCAPSED_STRING
Inesperado T_ENCAPSED_AND_WHITESPACE
Los nombres difíciles de manejar
T_CONSTANT_ENCAPSED_STRING
y seT_ENCAPSED_AND_WHITESPACE
refieren a literales citados ."string"
Se usan en diferentes contextos, pero el problema de sintaxis es bastante similar. Las advertencias T_ENCAPSED ... se producen en un contexto de cadena entre comillas dobles, mientras que las cadenas T_CONSTANT ... a menudo se extravían en expresiones o declaraciones PHP simples.
Interpolación de variable incorrecta
Y aparece con mayor frecuencia para la interpolación de variables PHP incorrecta:
Citar claves de matrices es imprescindible en el contexto de PHP. Pero en cadenas dobles (o HEREDOC) esto es un error. El analizador se queja de la comilla simple contenida
'string'
, porque generalmente espera un identificador / clave literal allí.Más precisamente, es válido usar sintaxis simple estilo PHP2 dentro de comillas dobles para referencias de matriz:
Sin embargo, las matrices anidadas o las referencias de objetos más profundas requieren la sintaxis de expresión de cadena rizada compleja :
Si no está seguro, esto es comúnmente más seguro de usar. A menudo incluso se considera más legible. Y los IDE mejores en realidad usan una coloración de sintaxis distinta para eso.
Falta concatenación
Si una cadena sigue una expresión, pero carece de una concatenación u otro operador, verá que PHP se queja del literal de la cadena:
Si bien es obvio para usted y para mí, PHP simplemente no puede adivinar que la cadena estaba destinada a agregarse allí.
Cajas confusas de comillas
Se produce el mismo error de sintaxis al confundir delimitadores de cadena . Una cadena iniciada por una comilla simple
'
o doble"
también termina con la misma.Ese ejemplo comenzó con comillas dobles. Pero las comillas dobles también estaban destinadas a los atributos HTML. Sin embargo, el operador de concatenación previsto se interpretó como parte de una segunda cadena entre comillas simples.
Este es un buen ejemplo en el que no debe salir de comillas dobles en primer lugar. En su lugar, solo use los
\"
escapes adecuados para las citas de los atributos HTML:Si bien esto también puede conducir a la confusión de sintaxis, todos los mejores IDE / editores nuevamente ayudan al colorear las comillas escapadas de manera diferente.
Falta la cita de apertura
Equivalentemente se olvida abrir
"
/'
cita una receta para los errores del analizador sintáctico:Aquí
', '
se convertiría en una cadena literal después de una palabra desnuda, cuando obviamentelogin
estaba destinado a ser un parámetro de cadena.Listas de matrices
Si pierde una
,
coma en un bloque de creación de matriz, el analizador verá dos cadenas consecutivas:Tenga en cuenta que la última línea siempre puede contener una coma adicional, pero pasar por alto una en el medio es imperdonable. Lo cual es difícil de descubrir sin resaltar la sintaxis.
Listas de parámetros de funciones
Lo mismo para las llamadas a funciones :
Cuerdas fuera de control
Una variación común son los terminadores de cadena olvidados:
Aquí PHP se queja de dos literales de cadena que se siguen uno al otro. Pero la verdadera causa es la cadena anterior no cerrada, por supuesto.
Ver también
fuente
T_STRING inesperado
T_STRING
es un poco inapropiado. No se refiere a una cita"string"
. Significa que se encontró un identificador sin formato. Esto puede variar desdebare
palabras hasta restos deCONSTANT
nombres de funciones, cadenas no citadas olvidadas o cualquier texto sin formato.Cadenas mal citadas
Sin embargo, este error de sintaxis es más común para valores de cadena mal citados. Cualquier sin escape y parásito
"
o'
cita formará una expresión no válida:El resaltado de sintaxis hará que tales errores sean súper obvios. Es importante recordar utilizar barras diagonales inversas para escapar de
\"
comillas dobles o\'
comillas simples, dependiendo de cuál se utilizó como encerramiento de cadena ."
comillas dobles literales .echo
/print
líneas en lugar de escapar dentro y fuera. Mejor aún, considere una sección de HEREDOC .Otro ejemplo es usar la entrada PHP dentro del código HTML generado con PHP:
Esto sucede si
$text
es grande con muchas líneas y el desarrollador no ve todo el valor de la variable PHP y se enfoca en el fragmento de código olvidando su fuente. El ejemplo está aquí.Consulte también ¿Cuál es la diferencia entre cadenas de comillas simples y comillas dobles en PHP? .
Cuerdas no cerradas
Si pierde un cierre
"
, un error de sintaxis generalmente se materializa más tarde. Una cadena sin terminar a menudo consumirá un poco de código hasta el siguiente valor de cadena deseado:No es solo lo literal lo
T_STRING
que el analizador puede protestar entonces. Otra variación frecuente es unUnexpected '>'
HTML literal sin comillas.Citas de cadenas no programadas
Si copia y pega código de un blog o sitio web, a veces termina con un código no válido. Las citas tipográficas no son lo que PHP espera:
Las comillas tipográficas / inteligentes son símbolos Unicode. PHP los trata como parte del texto alfanumérico contiguo. Por ejemplo,
”these
se interpreta como un identificador constante. Pero cualquier literal de texto siguiente es visto como una palabra clave / T_STRING por el analizador.El punto y coma que falta; de nuevo
Si tiene una expresión no terminada en líneas anteriores, entonces cualquier instrucción siguiente o construcción del lenguaje se ve como un identificador sin formato:
PHP simplemente no puede saber si pretendía ejecutar dos funciones después de otra, o si pretendía multiplicar sus resultados, agregarlos, compararlos o solo ejecutar uno
||
u otro.Cortas etiquetas y
<?xml
encabezados abiertos en scripts PHPEsto es bastante raro. Pero si short_open_tags están habilitados, entonces no puede comenzar sus scripts PHP con una declaración XML :
PHP lo verá
<?
y lo reclamará por sí mismo. No entenderá para quéxml
estaba destinado el callejero . Será interpretado como constante. Pero elversion
será visto como otro literal / constante. Y dado que el analizador no puede tener sentido de dos literales / valores posteriores sin un operador de expresión en el medio, será un error del analizador.Personajes invisibles de Unicode
La causa más horrible de los errores de sintaxis son los símbolos Unicode, como el espacio que no se rompe . PHP permite caracteres Unicode como nombres de identificadores. Si recibe un reclamo del analizador T_STRING por código totalmente insospechado como:
Necesita romper otro editor de texto. O incluso un hexeditor. Lo que parece espacios simples y líneas nuevas aquí, puede contener constantes invisibles. Los IDE basados en Java a veces son ajenos a una lista de materiales UTF-8 destrozada dentro de espacios de ancho cero, separadores de párrafos, etc. Intente volver a editar todo, eliminar espacios en blanco y agregar espacios normales nuevamente.
Puede reducirlo agregando
;
separadores de instrucciones redundantes en cada inicio de línea:El
;
punto y coma adicional aquí convertirá el carácter invisible anterior en una referencia constante indefinida (expresión como declaración). Lo que a cambio hace que PHP produzca un aviso útil.Falta el signo `$` delante de los nombres de las variables
Las variables en PHP están representadas por un signo de dólar seguido del nombre de la variable.
El signo de dólar (
$
) es un sigilo que marca el identificador como el nombre de una variable. Sin este sigilo, el identificador podría ser una palabra clave del lenguaje o una constante .Este es un error común cuando el código PHP fue "traducido" del código escrito en otro lenguaje (C, Java, JavaScript, etc.). En tales casos, una declaración del tipo de variable (cuando el código original se escribió en un lenguaje que usa variables escritas) también podría escabullirse y producir este error.
Comillas escapadas
Si lo usa
\
en una cadena, tiene un significado especial. Esto se llama un " personaje de escape " y normalmente le dice al analizador que tome el siguiente personaje literalmente.Ejemplo:
echo 'Jim said \'Hello\'';
imprimiráJim said 'hello'
Si escapa de la cita de cierre de una cadena, la cita de cierre se tomará literalmente y no de la forma prevista, es decir, como una cita imprimible como parte de la cadena y no cerrará la cadena. Esto se mostrará como un error de análisis comúnmente después de abrir la siguiente cadena o al final del script.
Error muy común al especificar rutas en Windows:
"C:\xampp\htdocs\"
está mal. Es necesario"C:\\xampp\\htdocs\\"
.fuente
Inesperado
(
Los paréntesis de apertura generalmente siguen construcciones de lenguaje como
if
/foreach
/for
/array
/list
o comienzan una expresión aritmética. Son sintácticamente incorrectos después"strings"
, un previo()
, un solitario$
y en algunos contextos de declaración típicos.Parámetros de declaración de función
Una ocurrencia más rara de este error es tratar de usar expresiones como parámetros de función predeterminados . Esto no es compatible, incluso en PHP7:
Los parámetros en una declaración de función solo pueden ser valores literales o expresiones constantes. A diferencia de las invocaciones de funciones, donde puede usar libremente
whatever(1+something()*2)
, etc.Valores predeterminados de propiedad de clase
Lo mismo para las declaraciones de miembros de clase , donde solo se permiten valores literales / constantes, no expresiones:
Poner tales cosas en el constructor. Consulte también ¿Por qué los atributos PHP no permiten funciones?
Nuevamente, tenga en cuenta que PHP 7 solo permite
var $xy = 1 + 2 +3;
expresiones constantes allí.Sintaxis de JavaScript en PHP
El uso de JavaScript o la sintaxis de jQuery no funcionará en PHP por razones obvias:
Cuando esto sucede, generalmente indica una cadena precedente sin terminar; y
<script>
secciones literales que se filtran en el contexto del código PHP.isset (()), vacío, clave, siguiente, actual
Ambos
isset()
yempty()
son lenguajes incorporados, no funciones. Ellos necesitan tener acceso a una variable directamente . Si, sin darse cuenta, agrega demasiado paréntesis, creará una expresión:Lo mismo se aplica a cualquier construcción de lenguaje que requiera acceso de nombre de variable implícito. Estas incorporaciones son parte de la gramática del lenguaje, por lo tanto, no permiten paréntesis decorativos adicionales.
Las funciones de nivel de usuario que requieren una referencia de variable -pero obtener un resultado de expresión aprobado- conducen a errores de tiempo de ejecución.
Inesperado
)
Parámetro de función ausente
No puede tener comas perdidas al final de una llamada de función . PHP espera un valor allí y, por lo tanto, se queja de un
)
paréntesis de cierre temprano .Una coma final solo se permite en
array()
olist()
construye.Expresiones inacabadas
Si olvida algo en una expresión aritmética, el analizador se da por vencido. Porque, ¿cómo debería interpretar eso?
Y si olvidó el cierre
)
incluso, entonces recibiría una queja sobre el punto y coma inesperado.Foreach como
constant
Para los prefijos variables olvidados
$
en las declaraciones de control , verá:PHP aquí a veces te dice que esperaba un
::
en su lugar. Porque una clase :: $ variable podría haber satisfecho la expresión esperada de $ variable.Inesperado
{
Llaves
{
y}
encerrar bloques de código. Y los errores de sintaxis sobre ellos generalmente indican un anidamiento incorrecto.Subexpresiones inigualables en un
if
Por lo general, son desequilibrados
(
y)
son la causa si el analizador se queja de que la apertura rizada{
aparece demasiado pronto. Un simple ejemplo:Cuente sus paréntesis o use un IDE que ayude con eso. Además, no escriba código sin espacios. La legibilidad cuenta.
{y} en contexto de expresión
No puedes usar llaves en las expresiones. Si confundes paréntesis y rizos, no se ajustará a la gramática del lenguaje:
Existen algunas excepciones para la construcción del identificador, como la variable de ámbito local
${references}
.Variables variables o expresiones var rizadas
Esto es bastante raro. Pero también puede obtener
{
y}
analizar quejas para expresiones variables complejas:Aunque hay una mayor probabilidad de un inesperado
}
en tales contextos.Inesperado
}
Al obtener un
}
error "inesperado ", la mayoría de las veces cerró un bloque de código demasiado pronto.Última declaración en un bloque de código
Puede suceder para cualquier expresión no terminada.
Y si la última línea en un bloque de función / código carece de un
;
punto y coma final :Aquí el analizador no puede decir si quizás aún desea agregar
+ 25;
al resultado de la función o algo más.Anidamiento de bloque inválido / Olvidado
{
A veces verá este error del analizador cuando un bloque de código se
}
cerró demasiado pronto o si olvidó una apertura{
incluso:En el fragmento anterior
if
, no tenía una{
llave de apertura . Así, el cierre a}
continuación se volvió redundante. Y, por lo tanto, el próximo cierre}
, que estaba destinado a la función, no era asociable a la{
llave de apertura original .Tales errores son aún más difíciles de encontrar sin una sangría de código adecuada. Use un IDE y un corchete.
Inesperado
{
, esperando(
Las construcciones de lenguaje que requieren un encabezado de condición / declaración y un bloque de código desencadenarán este error.
Listas de parámetros
Por ejemplo, no se permiten funciones declaradas erróneamente sin lista de parámetros :
Condiciones de la declaración de control
Y tampoco puede tener una
if
condición sin .Lo cual no tiene sentido, obviamente. Lo mismo para los sospechosos habituales,
for
/foreach
,while
/do
, etc.fuente
$ Final inesperado
Cuando PHP habla de un "inesperado
$end
", significa que su código terminó prematuramente. (El mensaje es un poco engañoso cuando se toma literalmente. No se trata de una variable llamada "$ end", como a veces suponen los recién llegados. Se refiere al "final del archivo" EOF).Es casi siempre sobre un faltante
}
llave de cierre para cerrar los bloques de código anteriores.Nuevamente, use la sangría adecuada para evitar tales problemas.
Use un IDE con coincidencia de paréntesis para averiguar dónde
}
está mal. Hay atajos de teclado en la mayoría de los IDE y editores de texto:La mayoría de los IDE también resaltan llaves, corchetes y paréntesis coincidentes. Lo que hace que sea bastante fácil inspeccionar su correlación:
Expresiones interminables
Y el
Unexpected $end
error de sintaxis / analizador también puede ocurrir para expresiones o declaraciones no terminadas:$var = func(1,
?>
EOFEntonces, mire primero el final de los guiones. Un seguimiento a
;
menudo es redundante para la última declaración en cualquier script PHP. Pero deberías tener uno. Precisamente porque reduce los problemas de sintaxis.Marcadores HEREDOC sangrados
Otra ocurrencia común aparece con las cadenas HEREDOC o NOWDOC . El marcador de terminación se ignora con espacios iniciales, pestañas, etc.
Por lo tanto, el analizador asume que la cadena HEREDOC continuará hasta el final del archivo (por lo tanto, "$ final inesperado"). Casi todos los IDE y editores de resaltado de sintaxis lo harán obvio o lo advertirán.
Comillas escapadas
Si lo usa
\
en una cadena, tiene un significado especial. Esto se llama un " personaje de escape " y normalmente le dice al analizador que tome el siguiente personaje literalmente.Ejemplo:
echo 'Jim said \'Hello\'';
imprimiráJim said 'hello'
Si escapa de la cita de cierre de una cadena, la cita de cierre se tomará literalmente y no de la forma prevista, es decir, como una cita imprimible como parte de la cadena y no cerrará la cadena. Esto se mostrará como un error de análisis comúnmente después de abrir la siguiente cadena o al final del script.
Error muy común al especificar rutas en Windows:
"C:\xampp\htdocs\"
está mal. Es necesario"C:\\xampp\\htdocs\\"
.Sintaxis alternativa
Algo más raro puede ver este error de sintaxis cuando se usa la sintaxis alternativa para bloques de declaración / código en plantillas. El uso
if:
yelse:
y una faltaendif;
, por ejemplo.Ver también:
fuente
Inesperado T_IF
Inesperado T_ELSEIF
Inesperado T_ELSE
Inesperado T_ENDIF
Bloques de control condicional
if
,elseif
yelse
seguir una estructura simple. Cuando encuentre un error de sintaxis, lo más probable es que solo sea anidamiento de bloque inválido → con{
llaves faltantes}
, o una demasiada.Falta
{
o}
debido a una sangría incorrectaLas llaves de código que no coinciden son comunes a código menos formateado como:
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.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 expresionesUn 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:Lo cual no es válido, por supuesto.
Puede usar un condicional ternario , pero tenga cuidado con los impactos de legibilidad.
De lo contrario, rompa tales construcciones de salida: use múltiples
if
syecho
s .Mejor aún, use variables temporales y coloque sus condicionales antes:
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 :Que es estructuralmente idéntico al uso
if
dentro de una concatenación / expresión de cadena.Tendrás que usar una tarea en el bloque de código :
Alternativamente, recurra a una
?:
comparación ternaria.Si en si
Usted no puede un nido
if
dentro de una condición ya sea:Lo que obviamente es redundante, porque
and
(oor
) ya permite encadenar comparaciones.;
Punto y coma olvidadoUna 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:
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:
Lo que sucede con más frecuencia de lo que puedas imaginar.
if ()
expresión con;
ella, se ejecutará una declaración nula. ¡El se;
convierte en un vacío{}
propio!{…}
bloque, por lo tanto, se separa delif
, y siempre se ejecutará.else
ya no tenía una relación con unaif
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:
Donde
;
después del bloque de código{…}
termina laif
construcción completa , cortando laelse
rama sintácticamente.No usar bloques de código
Está sintácticamente permitido omitir llaves
{
...}
para bloques de código enif
/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:
Pero para usar bloques de código, ¡tienes que escribirlos
{
...}
como tales!Else / Elseif en orden incorrecto
Una cosa para recordar es el orden condicional , por supuesto.
Puede tener tantos
elseif
s como desee, peroelse
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:
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 unif/elseif
debe estar en el mismo bloque PHP<?php ?>
que el siguienteelseif/else
. Esto generará un error ya que el cierre}
de lasif
necesidades debe ser parte deelseif
:La forma correcta
<?php } elseif
: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
yelseif
/ oelse
tokens estructurales:O bien solo puede ocurrir en
{…}
bloques de código, no entre tokens de estructura de control.if
y seelse
bifurca.Tampoco puede separar un if / else entre diferentes estructuras de control:
No existe una relación sintáctica entre
if
yelse
. Elforeach
alcance léxico termina en}
, por lo que no tiene sentido que laif
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 ningunaif:
.El uso
} endif;
es un terminador dobleif
.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:
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.fuente
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
>
Los operadores de comparación, como
==
,>=
,===
,!=
,<>
,!==
y<=
o<
y>
sobre todo deben utilizarse solo en las expresiones, tales comoif
expresiones. Si el analizador se queja de ellos, a menudo significa un emparejamiento incorrecto o(
)
parens no coincidentes a su alrededor.Agrupación de Parens
En particular, para las
if
declaraciones con comparaciones múltiples, debe tener cuidado de contar correctamente los paréntesis de apertura y cierre :Aquí la
if
condición aquí ya fue terminada por el)
Una vez que sus comparaciones se vuelven lo suficientemente complejas, a menudo ayuda dividirlas en
if
construcciones múltiples y anidadas .isset () mezclado con comparación
Un recién llegado común es pitfal que intenta combinar
isset()
oempty()
con comparaciones:O incluso:
Esto no tiene sentido para PHP, ya que
isset
yempty
son construcciones del lenguaje que sólo aceptan los nombres de variables. Tampoco tiene sentido comparar el resultado, porque la salida es solo / ya booleana.Confuso
>=
mayor o igual con el=>
operador de matrizAmbos operadores se ven algo similares, por lo que a veces se mezclan:
Solo necesita recordar que este operador de comparación se llama " mayor o igual " para hacerlo bien.
Ver también: estructura de sentencias If en PHP
Nada contra lo que comparar
Tampoco puede combinar dos comparaciones si pertenecen al mismo nombre de variable:
PHP no puede deducir que pretendías comparar la variable inicial nuevamente. Las expresiones generalmente se emparejan de acuerdo con la precedencia del operador , por lo que para el momento en que
<
se ve, solo quedaría un resultado booleano de la variable original.Ver también: inesperado T_IS_SMALLER_OR_EQUAL
Cadenas de comparación
No se puede comparar con una variable con una fila de operadores:
Esto tiene que dividirse en dos comparaciones, cada una en contra
$x
.En realidad, esto es más un caso de expresiones en la lista negra (debido a la asociatividad del operador equivalente). Es sintácticamente válido en algunos lenguajes de estilo C, pero PHP tampoco lo interpretaría como la cadena de comparación esperada.
Inesperado
>
Inesperado
<
Los operadores mayor
>
o menor que<
no tienen unT_XXX
nombre de tokenizador personalizado . Y si bien pueden estar fuera de lugar como todos los demás, es más frecuente que el analizador se queje de ellos por cadenas mal citadas y HTML mezclado:Esto equivale a una cadena que
"<a href='z"
se compara>
con una constante literalHello
y luego otra<
comparación. O al menos así lo ve PHP. La causa real y el error de sintaxis fue la"
terminación prematura de la cadena .Tampoco es posible anidar etiquetas de inicio PHP:
Ver también:
fuente
Inesperado T_IF
Inesperado T_FOREACH
Inesperado T_FOR
Inesperado T_WHILE
Inesperado T_DO
Inesperado T_ECHO
Control de construcciones tales como
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
sólo se puede utilizar como declaraciones. Suelen residir en una línea solos.Punto y coma; donde estas
De manera bastante universal, se ha perdido un punto y coma en la línea anterior si el analizador se queja de una declaración de control:
Solución: busque en la línea anterior; Añadir punto y coma.
Declaraciones de clase
Otra ubicación donde esto ocurre es en las declaraciones de clase . En la sección de clase, solo puede enumerar las inicializaciones de propiedades y las secciones de método. Ningún código puede residir allí.
Tales errores de sintaxis comúnmente se materializan para anidados incorrectamente
{
y}
. En particular, cuando los bloques de código de función se cerraron demasiado pronto.Declaraciones en contexto de expresión
La mayoría de las construcciones de lenguaje solo se pueden usar como declaraciones . No están destinados a colocarse dentro de otras expresiones:
Del mismo modo, no puede usar un
if
en cadenas, expresiones matemáticas o en otro lugar:Para incrustar
if
condiciones similares en una expresión específicamente, a menudo desea utilizar una?:
evaluación ternaria .Lo mismo se aplica a
for
,while
,global
,echo
y en menor medidalist
.Mientras que
print()
es un lenguaje incorporado que puede usarse en el contexto de expresión. (Pero rara vez tiene sentido).Palabras clave reservadas como identificadores
Tampoco puede usar
do
uif
otras construcciones de lenguaje para funciones definidas por el usuario o nombres de clase. (Quizás en PHP 7. Pero incluso entonces no sería aconsejable).fuente
Inesperado '?'
Si está intentando utilizar el operador de fusión nula
??
en una versión de PHP anterior a PHP 7, obtendrá este error.Inesperado '?', Esperando variable
Un error similar puede ocurrir para los tipos anulables, como en:
Lo que nuevamente indica que se está utilizando una versión de PHP desactualizada (ya sea la versión CLI
php -v
o el servidor web vinculadophpinfo();
).fuente
T_LNUMBER inesperado
El token se
T_LNUMBER
refiere a un "largo" / número.Nombres de variables inválidos
En PHP, y en la mayoría de los otros lenguajes de programación, las variables no pueden comenzar con un número. El primer carácter debe ser alfabético o subrayado.
Muy a menudo surge el uso de
preg_replace
marcadores"$1"
de posición en contexto PHP:Donde la devolución de llamada debería haber sido citada. (Ahora, la
/e
bandera de expresiones regulares ha quedado en desuso. Pero a veces todavía se usa incorrectamente en laspreg_replace_callback
funciones).La misma restricción de identificador se aplica a las propiedades del objeto , por cierto.
Si bien el tokenizer / parser no permite un literal
$1
como nombre de variable, uno podría usar${1}
o${"1"}
. Que es una solución sintáctica para identificadores no estándar. (Es mejor considerarlo como una búsqueda de alcance local. Pero en general: ¡prefiera matrices simples para tales casos!)Divertidamente, pero no muy recomendable, el analizador PHP permite identificadores Unicode; tal que
$➊
sería válido (A diferencia de un literal1
).Entrada de matriz perdida
También puede ocurrir un largo inesperado para las declaraciones de matriz , cuando faltan
,
comas:O también funciones llamadas y declaraciones, y otras construcciones:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Por lo general, hay uno
;
o,
falta para separar listas o expresiones.HTML mal citado
Y nuevamente, las cadenas mal citadas son una fuente frecuente de números extraviados:
Dichos casos deben tratarse más o menos como errores T_STRING inesperados .
Otros identificadores
Ni las funciones, las clases ni los espacios de nombres se pueden nombrar comenzando con un número:
Más o menos lo mismo que para los nombres de variables.
fuente
Inesperado '='
Esto puede ser causado por tener caracteres no válidos en un nombre de variable. Los nombres de las variables deben seguir estas reglas:
fuente
'Continuar' inesperado (T_CONTINUE)
continue
es una declaración (como for, or if) y debe aparecer de forma independiente. No se puede usar como parte de una expresión. En parte porque continuar no devuelve un valor, pero en una expresión cada subexpresión debe dar lugar a algún valor, por lo que la expresión general da como resultado un valor. Esa es la diferencia entre una declaración y una expresión.Eso significa
continue
que no se puede usar en una declaración ternaria ni en ninguna declaración que requiera un valor de retorno.'Descanso' inesperado (T_BREAK)
Lo mismo vale, por
break;
supuesto. Tampoco se puede usar en el contexto de expresión, sino una declaración estricta (en el mismo nivelforeach
o unif
bloque).'Retorno' inesperado (T_RETURN)
Ahora, esto podría ser más sorprendente
return
, pero eso también es solo una declaración de nivel de bloque . Devuelve un valor (o NULL) al ámbito / función superior, pero no se evalúa como expresión en sí misma. → Eso es: no tiene sentido hacerreturn(return(false);;
fuente
Inesperado '.'
Esto puede ocurrir si está intentando utilizar el operador splat (
...
) en una versión no compatible de PHP....
primero estuvo disponible en PHP 5.6 para capturar un número variable de argumentos para una función:En PHP 7.4, podría usarlo para expresiones de matriz .
fuente
Inesperado 'fin del tiempo' (T_ENDWHILE)
La sintaxis utiliza dos puntos; si no hay dos puntos, se producirá el error anterior.
La alternativa a esta sintaxis es usar llaves:
http://php.net/manual/en/control-structures.while.php
fuente
Un mensaje de error que comienza
Parse error: syntax error, unexpected ':'
puede ser causado al escribir por error una referencia estática de claseClass::$Variable
comoClass:$Variable
.fuente