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:

  • 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.

Solución

¿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:

  • Utiliza una sangría de código adecuada, o adopta cualquier estilo de codificación elevado. La legibilidad evita las irregularidades.
  • Usa un IDE o editor para PHP con resaltado de sintaxis. Que también ayuda con el equilibrio de paréntesis/corchetes. Esperado: punto y coma
  • 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 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 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.

    Resolver errores de sintaxis

    Hay muchos enfoques para reducir y arreglar los contratiempos de sintaxis.

  • Abra el archivo fuente mencionado. Mire la mencionada línea de código.
    • En el caso de las cadenas de caracteres que se escapan y los operadores mal colocados, normalmente es aquí donde se encuentra el culpable.
    • Lee la línea de izquierda a derecha e imagina qué hace cada símbolo.
  • Con más frecuencia, también hay que mirar las líneas precedentes.
    • En particular, faltan los puntos y comas ; en los finales de línea/afirmación anteriores. (Al menos desde el punto de vista estilístico. )
    • Si los bloques de código {} 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.
  • ¡Mira la coloración de la sintaxis!
    • Las cadenas, variables y constantes deberían tener diferentes colores.
    • Los operadores +-*/. también deberían tener colores distintos. Si no, 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 marcador de cadena de cierre "o'que no ha sido capturado.
    • 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 solos si no es ++, --, o paréntesis después de un operador. Dos cadenas/identificadores directamente seguidos son incorrectos en la mayoría de los contextos.
  • Los espacios en blanco son tus amigos. Sigue cualquier estilo de codificación. Sin embargo, no molestemos a los novatos con PSR-x aquí, ¿K? -->
  • Romper temporalmente las líneas largas.
    • Puedes añadir líneas nuevas libremente entre operadores o constantes y cadenas. El parser concretará entonces el número de línea para los errores de parsing. En lugar de mirar el código muy largo, puede aislar el símbolo de sintaxis que falta o está mal colocado.
    • Dividir las complejas sentencias si en condiciones si distintas o anidadas.
    • En lugar de largas fórmulas matemáticas o cadenas lógicas, utilice variables temporales para simplificar el código. (Más legible = menos errores).
    • Añada nuevas líneas entre:
      1. El código que pueda identificar fácilmente como correcto,
      2. Las partes de las que no está seguro,
      3. Y las líneas de las que se queja el parser; Dividir los bloques de código largos realmente ayuda a localizar el origen de los errores de sintaxis.
  • Comentar el código infractor.
    • Si no puede aislar el origen del problema, empiece a comentar (y así eliminar temporalmente) bloques de código.
    • En cuanto se haya deshecho del error de análisis, habrá encontrado el origen del problema. Mira más de cerca allí.
    • A veces querrá eliminar temporalmente bloques completos de funciones/métodos. (En el caso de llaves no emparejadas 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 sintácticas confusas.
    • El operador de condición ternario ? : 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.
    • 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 normales de {código}`.
  • Los errores más frecuentes de los recién llegados son:
    • Faltan puntos y comas ; para terminar las sentencias/líneas.
    • Comillas de cadena no coincidentes para "o'` y comillas sin esconder dentro.
    • Operadores olvidados, en particular para la concatenación de cadenas ..
    • Paréntesis no equilibrados ( paréntesis ). Cuéntelos en la línea reportada. ¿Hay un número igual de ellos?
  • No olvide que la resolución de un problema de sintaxis puede descubrir el siguiente.
    • Si consigue que un problema desaparezca, pero que otro aparezca en el código siguiente, 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 fracaso. (Aunque no siempre.)
  • Restaure una copia de seguridad del código que funcionaba anteriormente, si no puede arreglarlo.
    • Adopte un sistema de control de versiones del código fuente. Siempre puedes ver una "diferencia" entre la versión rota y la última que funciona. Lo que podría ser esclarecedor en cuanto a cuál es el problema de sintaxis.
  • Caracteres Unicode invisibles: En algunos casos, necesitas usar un editor hexadecimal o un editor/visualizador diferente en tu fuente. Algunos problemas no pueden ser encontrados simplemente mirando su código.
    • Pruebe grep --color -P -n "|[\x80-\xFF]" file.php como primera medida para encontrar símbolos no ASCII.
    • En particular, las listas de materiales, los espacios de ancho cero, o los espacios de no ruptura, y las comillas inteligentes regularmente pueden encontrar su camino en el código fuente.
  • Tenga cuidado con los tipos de saltos de línea que se guardan en los archivos.
    • PHP sólo honra \n las nuevas líneas, no \n los retornos de carro.
    • Lo cual es ocasionalmente un problema para los usuarios de MacOS (incluso en OS  X para editores mal configurados).
    • A menudo sólo aparece como un problema cuando se utilizan comentarios de una sola línea // o #. Los comentarios multilínea /*...*/ rara vez molestan al analizador cuando se ignoran los saltos de línea.
  • Si tu error de sintaxis no se transmite por la web: Sucede que tienes un error de sintaxis en tu máquina. Pero al publicar el mismo archivo en línea ya no lo muestra. Lo que sólo puede significar una de dos cosas:
    • Que estás viendo el archivo equivocado.
    • O tu código contenía un Unicode invisible (ver arriba). Puedes averiguarlo fácilmente: Simplemente copie su código desde el formulario web en su editor de texto.
  • Compruebe su versión de PHP. No todas las construcciones sintácticas están disponibles en todos los servidores.
    • 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.
  • No utilice palabras clave reservadas de PHP como identificadores de funciones/métodos, clases o constantes.
  • El ensayo y error es su último recurso. Si todo lo demás falla, siempre puede googlear su mensaje de error. Los símbolos sintácticos no son tan fáciles de buscar (aunque Stack Overflow está indexado por SymbolHound). Por lo tanto, puede ser necesario buscar en algunas páginas más antes de encontrar algo relevante. Otras guías:
  • PHP Debugging Basics por David Sklar
  • Arreglando errores de PHP por Jason McCreary
  • Errores de PHP - 10 errores comunes por Mario Lurig
  • Errores comunes de PHP y soluciones]15*
  • Cómo solucionar y arreglar su sitio web de WordPress
  • Guía de mensajes de error PHP para diseñadores - Smashing Magazine

    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 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.

Comentarios (2)

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.

  1. 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:

            ⇓
     func1()
     $var = 1 + 2; # error de análisis en la línea +2
  2. Concatenación de cadenas

    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.

  3. Faltan operadores de expresión

    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.

  4. 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:

                                           ⇓
     $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.

  5. 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:

     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.

  6. Variables después de identificadores

    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.

  7. 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 y for y foreach:

            ⇓
     foreach $array as $key) {

    Solución: añadir la apertura ( que falta entre la sentencia y la variable.

  8. Else no espera condiciones

          ⇓
     else ($var >= 0)

    Solución: Eliminar las condiciones de else o utilizar elseif.

  9. Necesita paréntesis para el cierre

          ⇓
     function() usa $var {}

    Solución: Añadir paréntesis alrededor de $var.

  10. 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:

     <?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.

Ver también

Comentarios (0)

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.

  1. 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*.
  2. [h3>Cadenas no cerradas Si omite un cierre " 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_STRINGs que el parser puede protestar entonces. Otra variación frecuente es un Unexpected '>' para HTML literal no citado.
  3. 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.
  4. 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.
  5. Etiquetas abiertas cortas y <?xml cabeceras en scripts PHP

    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.
  6. Caracteres 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.
  7. 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.
  8. 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\"`.
Comentarios (0)