Errores de análisis / sintaxis de PHP; y como resolverlos

651

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:

Referencias estrechamente relacionadas:

Y:

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 esrelacionado, pero un - 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.

mario
fuente
1
Estos no son datos suficientes para ser una respuesta, pero uno podría escribir un analizador con parsekit_compile_string y ponerle respuestas más amigables. Si se integra en su IDE, esto podría ser bastante informativo.
Owen Beresford el
44
Pones una cantidad impresionante de trabajo en esto. Respeto por eso. Probablemente sea muy bueno para los maestros aprender a señalar rápidamente los errores o para aquellos que crean IDEs o implementan soluciones rápidas. Sin embargo, los IDE ya harán la mayor parte de este trabajo por usted, como sugiere @Panique. Además, en muchos casos, volver a empezar desde cero es una buena opción.
allprog
1
@ Fred-ii- Creo que la mayoría de las causas son similares al T_IF / T_FOREACH / ...bloqueo. Aunque quería compilar un resumen más personalizado para las preguntas IF / ELSE / ELSEIF.
mario
1
@mario No sé cómo expresar esto, pero ¿deberían estas preguntas y respuestas ser reescritas y más estructuradas? (comentario temporal)
Rizier123
2
Sabes, desearía haber tenido esta lista cuando estaba aprendiendo PHP hace años. Muy útil, especialmente para principiantes.
Chipster

Respuestas:

291

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

Resumen de sintaxis de definición de funció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.

    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

Un típico mensaje de error de sintaxis dice:

Error de análisis: error de sintaxis, T_STRING inesperado , esperando ' ;' en file.php en la línea 217

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_STRINGexplica 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 ifdeclaraciones complejas en ifcondiciones 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:

      1. El código que puede identificar fácilmente como correcto,
      2. Las partes de las que no estás seguro,
      3. Y las líneas de las que se queja el analizador.

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

    • Adopte un sistema de versiones de código fuente. Siempre puede ver una diffde 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.phpcomo 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.inigeneral, o a través .htaccessde mod_php, o incluso .user.inicon 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:

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

Luego invoque el código anómalo accediendo a este script de contenedor.

También ayuda a habilitar PHP error_logy buscar en su servidor weberror.log cuando un script se bloquea con las respuestas HTTP 500.

mario
fuente
error_reporting(E_ALL | E_STRICT);para versiones anteriores de PHP
Geo
2
Algunos IDEs (como NetBeans) no solo admiten el resaltado de sintaxis sino también el formato de código. Si tiene el hábito de formatear su código correctamente y pedirle al IDE que lo vuelva a formatear por si acaso de vez en cuando, puede encontrar problemas difíciles de detectar, como llaves inigualables.
Josep Valls
115

Creo 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):

  1. NetBeans [gratis]
  2. Tormenta PHPS [$ 199 USD]
  3. Eclipse con PHP Plugin [gratis]
  4. Sublime [$ 80 USD] (principalmente un editor de texto, pero ampliable con complementos, como PHP Syntax Parser )
Sliq
fuente
2
Es obviamente. Sin embargo, al enumerar IDEs aquí, ¿puede explicar un poco dónde difieren en su utilidad de sintaxis? Sublime es principalmente un editor, no IDE; pero luego más bonita y ágil; principalmente solo resalta la sintaxis, pero también es cierto en la coincidencia de paréntesis. Descubre fácilmente los errores T_CONSTANT_AND_ENCAPSED al instante, por ejemplo, a diferencia de PHPStorm; que sin embargo tiene más líneas onduladas para errores en línea. Las sugerencias de sintaxis de NetBeans solían ser más crípticas que las de PHP incluso (más bien enumerar las construcciones permitidas). ¿Puedes compartir tu experiencia en pros / contras? Cuál es tu Eclipse / PDT favorito o ...?
mario
@mario Creo que estás muy metido en el tema, así que realmente no quiero decir nada malo aquí, pero todo el código que yo (y mis compañeros de equipo, amigos que codifican, socios independientes) he escrito en un IDE nunca se ejecutó. con un error de sintaxis Así que creo que al menos la verificación de sintaxis de Netbeans / PHPStorm es extremadamente poderosa. Pero tal vez he leído mal tu pregunta. Dame algunas horas ...;)
Sliq
Tu respuesta ya es acertada. Encajaría en el 99% de nuestras preguntas. Sin embargo, para el contexto aquí, me gustaría una consideración de compensación en la que IDE proporciona la información sobre herramientas más amigable para los novatos . Probablemente sea menor para nosotros, la coloración y las líneas onduladas son suficientes si eres lo suficientemente versado. Pero supongo que las diferencias podrían ser más significativas para los principiantes.
mario
Algunas veces un IDE no es una opción factible. Por ejemplo, realizar ediciones rápidas a un tema o complemento de WordPress. Sí, podría copiar todo el código en un IDE, pero luego tengo que abrirlo, pegarlo todo allí, configurar encabezados y todo ese tiempo perdido, cuando solo espero una edición rápida. Ahora, si está desarrollando nuevas funciones o está comenzando desde cero, sí, hágalo en un IDE. No te arrepentirás de tomar ese tiempo extra al comienzo para configurarlo.
1934286
Veo IDE como un avance, no solo como una caja de herramientas. Puede que no se ARREGLE pero puede ayudarlo a encontrar y prevenir errores de sintaxis. Muchas respuestas aquí parecen decir que si mantiene el código limpio tiene menos posibilidades de cometer un error y es más fácil de detectar. Bueno, con sangría automática, sugerencias de código, ocurrencia variable, corchetes de cierre automático y formateo automático me ahorra muchos errores tipográficos al día y es la principal ventaja por la que uso uno. Esto no cuenta todo lo demás más allá del alcance de esta pregunta (depurador, conector de base de datos, diagrama uml, etc.) IDE le ahorrará tiempo y evitará más que solo errores de sintaxis.
Louis Loudog Trottier
58

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 compatibles array().

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         

La desreferenciación de resultados de la función de matriz tampoco está disponible para versiones anteriores de PHP:

$result = get_whatever()["key"];
                      

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

    protected $var["x"] = "Nope";
                  
    
  • Confundir [con la apertura de llaves {o paréntesis (es un descuido común.

    foreach [$a as $b)
            
    

    O incluso:

    function foobar[$a, $b, $c] {
                   
    
  • O tratando de desreferenciar constantes (antes de PHP 5.6) como matrices:

    $var = const[123];
           
    

    Al menos PHP interpreta eso constcomo 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 globalpalabra clave en un miembro de una matriz asociativa. Esta no es una sintaxis válida:

    global $var['key'];


Inesperado ] cierre de corchetes

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

    function foobar($a, $b, $c] {
                              
  • O tratando de terminar una matriz donde no hay una:

    $var = 2];

    Que a menudo ocurre en declaraciones de matriz anidadas y de varias líneas .

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 

    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.

Mario
fuente
El enlace 'Convertidores descendentes de sintaxis PHP 5.4' github.com/IonutBajescu/short-arrays-to-long-arrays arriba está roto.
Danimal Reks
46

T_VARIABLE inesperado

Un "inesperado T_VARIABLE" significa que hay un $variablenombre literal , que no se ajusta a la estructura actual de expresión / declaración.

operador intencionalmente abstracto / inexacto + $ diagrama variable

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

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. Concatenación de cadenas

    Un error frecuente son las concatenaciones de cadenas con el .operador olvidado :

                                   
    print "Here comes the value: "  $value;

    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.

    La interpolación de cadenas es una característica central del lenguaje de script . No hay vergüenza en utilizarlo. Ignore cualquier aviso de microoptimización acerca de que la .concatenación de variables sea más rápida . No es.

  3. Operadores de expresión faltantes

    Por supuesto, el mismo problema puede surgir en otras expresiones, por ejemplo, operaciones aritméticas:

               
    print 4 + 7 $var;

    PHP no puede adivinar aquí si la variable debería haberse agregado, restado o comparado, etc.

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

                                          
    $var = array("1" => $val, $val2, $val3 $val4);

    O listas de parámetros de funciones:

                                    
    function myfunc($param1, $param2 $param3, $param4)

    Equivalentemente ves esto con listo globaldeclaraciones, o cuando falta un ;punto y coma en un forbucle.

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

    class xyz {      
        var $value = $_GET["input"];

    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.

  6. Variables después de identificadores

    Tampoco puede hacer que una variable siga un identificador directamente:

                 
    $this->myFunc$VAR();

    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.

    Tenga en cuenta que el uso de variables variables debería ser la excepción. Los recién llegados a menudo intentan usarlos de manera casual, incluso cuando las matrices serían más simples y más apropiadas.

  7. 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 ify fory foreachdeclaraciones:

           
    foreach $array as $key) {

    Solución: agregue la abertura que falta (entre la instrucción y la variable.

                          
    if ($var = pdo_query($sql) {
         $result = 

    La {llave no abre el bloque de código, sin cerrar primero la ifexpresión con el )paréntesis de cierre.

  8. Lo demás no espera condiciones

         
    else ($var >= 0)

    Solución: elimine las condiciones elseo el uso elseif.

  9. Necesita soportes para el cierre

         
    function() uses $var {}

    Solución: agregue corchetes alrededor $var.

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

    <?php
                              
    $var = new PDO(...);

    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

Mario
fuente
32

Inesperado T_CONSTANT_ENCAPSED_STRING
Inesperado T_ENCAPSED_AND_WHITESPACE

Los nombres difíciles de manejar T_CONSTANT_ENCAPSED_STRINGy se T_ENCAPSED_AND_WHITESPACErefieren 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.

  1. Interpolación de variable incorrecta

    Y aparece con mayor frecuencia para la interpolación de variables PHP incorrecta:

                                   
    echo "Here comes a $wrong['array'] access";

    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:

    echo "This is only $valid[here] ...";

    Sin embargo, las matrices anidadas o las referencias de objetos más profundas requieren la sintaxis de expresión de cadena rizada compleja :

    echo "Use {$array['as_usual']} with curly syntax.";

    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.

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

                           
    print "Hello " . WORLD  " !";

    Si bien es obvio para usted y para mí, PHP simplemente no puede adivinar que la cadena estaba destinada a agregarse allí.

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

                    
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟

    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.

    Consejo : Configure su editor / IDE para que use una coloración ligeramente distinta para cadenas de comillas simples y dobles. (También ayuda con la lógica de la aplicación para preferir, por ejemplo, cadenas de comillas dobles para la salida de texto y cadenas de comillas simples solo para valores de tipo constante).

    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:

    print "<a href=\"{$link}\">click here</a>";

    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.

  4. Falta la cita de apertura

    Equivalentemente se olvida abrir "/ 'cita una receta para los errores del analizador sintáctico:

                   
     make_url(login', 'open');

    Aquí ', 'se convertiría en una cadena literal después de una palabra desnuda, cuando obviamente loginestaba destinado a ser un parámetro de cadena.

  5. Listas de matrices

    Si pierde una ,coma en un bloque de creación de matriz, el analizador verá dos cadenas consecutivas:

    array(               
         "key" => "value"
         "next" => "....",
    );

    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.

  6. Listas de parámetros de funciones

    Lo mismo para las llamadas a funciones :

                             
    myfunc(123, "text", "and"  "more")
  7. Cuerdas fuera de control

    Una variación común son los terminadores de cadena olvidados:

                                    
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑

    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

mario
fuente
27

T_STRING inesperado

T_STRINGes un poco inapropiado. No se refiere a una cita "string". Significa que se encontró un identificador sin formato. Esto puede variar desde barepalabras hasta restos de CONSTANTnombres de funciones, cadenas no citadas olvidadas o cualquier texto sin formato.

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

                                     
     echo "<a href="http://example.com">click here</a>";

    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 .

    • Para mayor comodidad, debe preferir las comillas simples externas al generar HTML sin formato con comillas dobles.
    • Utilice cadenas de comillas dobles si desea interpolar variables, pero luego tenga cuidado de escapar de "comillas dobles literales .
    • Para una salida más larga, prefiera múltiples echo/ printlí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:

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'

    Esto sucede si $textes 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? .

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

                                                           
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯

    No es solo lo literal lo T_STRINGque el analizador puede protestar entonces. Otra variación frecuente es un Unexpected '>'HTML literal sin comillas.

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

    $text = Something something..’ + these ain't quotes”;

    Las comillas tipográficas / inteligentes son símbolos Unicode. PHP los trata como parte del texto alfanumérico contiguo. Por ejemplo, ”thesese interpreta como un identificador constante. Pero cualquier literal de texto siguiente es visto como una palabra clave / T_STRING por el analizador.

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

           
    func1()
    function2();

    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.

  5. Cortas etiquetas y <?xmlencabezados abiertos en scripts PHP

    Esto es bastante raro. Pero si short_open_tags están habilitados, entonces no puede comenzar sus scripts PHP con una declaración XML :

          
    <?xml version="1.0"?>

    PHP lo verá <?y lo reclamará por sí mismo. No entenderá para qué xmlestaba destinado el callejero . Será interpretado como constante. Pero el versionserá 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.

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

    <?php
        print 123;

    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:

    <?php
        ;print 123;

    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.

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

  8. 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\\".

Mario
fuente
18

Inesperado (

Los paréntesis de apertura generalmente siguen construcciones de lenguaje como if/ foreach/ for/ array/ listo 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.

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

    function header_fallback($value, $expires = time() + 90000) {

    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.

  2. Valores predeterminados de propiedad de clase

    Lo mismo para las declaraciones de miembros de clase , donde solo se permiten valores literales / constantes, no expresiones:

    class xyz {                   
        var $default = get_config("xyz_default");

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

  3. Sintaxis de JavaScript en PHP

    El uso de JavaScript o la sintaxis de jQuery no funcionará en PHP por razones obvias:

    <?php      
        print $(document).text();

    Cuando esto sucede, generalmente indica una cadena precedente sin terminar; y <script>secciones literales que se filtran en el contexto del código PHP.

  4. isset (()), vacío, clave, siguiente, actual

    Ambos isset()y empty()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:

              
    if (isset(($_GET["id"]))) {

    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 )

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

                  
    callfunc(1, 2, );

    Una coma final solo se permite en array()o list()construye.

  2. Expresiones inacabadas

    Si olvida algo en una expresión aritmética, el analizador se da por vencido. Porque, ¿cómo debería interpretar eso?

                   
    $var = 2 * (1 + );

    Y si olvidó el cierre )incluso, entonces recibiría una queja sobre el punto y coma inesperado.

  3. Foreach como constant

    Para los prefijos variables olvidados $en las declaraciones de control , verá:

                           
    foreach ($array as wrong) {

    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.

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

                                  
    if (($x == $y) && (2 == true) {

    Cuente sus paréntesis o use un IDE que ayude con eso. Además, no escriba código sin espacios. La legibilidad cuenta.

  2. {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:

               
    $var = 5 * {7 + $x};

    Existen algunas excepciones para la construcción del identificador, como la variable de ámbito local ${references}.

  3. Variables variables o expresiones var rizadas

    Esto es bastante raro. Pero también puede obtener {y }analizar quejas para expresiones variables complejas:

                          
    print "Hello {$world[2{]} !";

    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.

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

    function whatever() {
        doStuff()
    }            

    Aquí el analizador no puede decir si quizás aún desea agregar + 25;al resultado de la función o algo más.

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

    function doStuff() {
        if (true)    
            print "yes";
        }
    }   

    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.

  1. Listas de parámetros

    Por ejemplo, no se permiten funciones declaradas erróneamente sin lista de parámetros :

                     
    function whatever {
    }
  2. Condiciones de la declaración de control

    Y tampoco puede tener una ifcondición sin .

      
    if {
    }

    Lo cual no tiene sentido, obviamente. Lo mismo para los sospechosos habituales, for/ foreach, while/ do, etc.

    Si tiene este error en particular, definitivamente debería buscar algunos ejemplos manuales.

mario
fuente
1
Estaba buscando respuesta a mi pregunta en esta publicación, pero encontré la respuesta al problema de "Inesperado {", por eso quería compartir con mi respuesta, para mí el problema era la codificación de salto de línea, de alguna manera algunos de mis los archivos usaban saltos de línea de Macintosh, pero cuando los cambié a saltos de línea de Windows, mi problema (en localhost (WAMP) todo funciona, pero en el servidor web de Linux no) se resolvió.
Edgars Aivars
@EdgarsAivars ¡Gracias por tu comentario! Los saltos de línea específicos de la plataforma son, de hecho, un problema poco común y complicado. Probablemente lo mencionaré aquí también. (Solo se mencionó como aparte en la otra respuesta de referencia )
Mario
Descubrí que obtener Inesperado} se debía a que una parte de mi código usaba la etiqueta corta php <? en lugar de <? php, me llevó un tiempo encontrar este, ya que funcionaba en otros servidores.
c7borg
14

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

Causa: no balanceada {y }para bloques de código / y declaraciones de funciones o clases.

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:

    • NetBeans, PhpStorm, Komodo: Ctrl[yCtrl]
    • Eclipse, Aptana: CtrlShiftP
    • Atom, Sublime: Ctrlm- Zend StudioCtrlM
    • Geany, Notepad ++: CtrlB- Joe: CtrlG- Emacs: C-M-n- Vim:%

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:

Coincidencia de corchetes en un IDE

Expresiones interminables

Y el Unexpected $enderror de sintaxis / analizador también puede ocurrir para expresiones o declaraciones no terminadas:

  • $var = func(1, ?>EOF

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

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

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:y else:y una falta endif;, por ejemplo.

Ver también:

mario
fuente
14

Inesperado T_IF
Inesperado T_ELSEIF
Inesperado T_ELSE
Inesperado T_ENDIF

Bloques de control condicional if, elseify elseseguir 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.

ingrese la descripción de la imagen aquí

  1. Falta {o }debido a una sangría incorrecta

    Las llaves de código que no coinciden son comunes a código menos formateado como:

    if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
    ($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){

    Si su código se ve así, ¡comience de nuevo! De lo contrario, no se puede arreglar para ti ni para nadie más. No tiene sentido mostrar esto en Internet para pedir ayuda.

    Solo podrá solucionarlo si puede seguir visualmente la estructura anidada y la relación de los condicionales if / else y sus {bloques de código }. Use su IDE para ver si están todos emparejados.

    if (true) {
         if (false) {
                  
         }
         elseif ($whatever) {
             if ($something2) {
                 
             } 
             else {
                 
             }
         }
         else {
             
         }
         if (false) {    //   a second `if` tree
             
         }
         else {
             
         }
    }
    elseif (false) {
        
    }

    Cualquier doble } }no solo cerrará una rama, sino una estructura de condición previa. Por lo tanto, quédate con un estilo de codificación; no mezcle y combine en árboles if / else anidados.

    Además de la consistencia aquí, resulta útil para evitar condiciones prolongadas también. Utilice variables o funciones temporales para evitar ifexpresiones ilegibles .

  2. IF no se puede usar en expresiones

    Un error sorprendentemente frecuente de los recién llegados es tratar de usar una ifdeclaración en una expresión, como una declaración impresa:

                       
    echo "<a href='" . if ($link == "example.org") { echo 

    Lo cual no es válido, por supuesto.

    Puede usar un condicional ternario , pero tenga cuidado con los impactos de legibilidad.

    echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";

    De lo contrario, rompa tales construcciones de salida: use múltiples ifsy echos .
    Mejor aún, use variables temporales y coloque sus condicionales antes:

    if ($link) { $href = "yes"; } else { $href = "no"; }
    echo "<a href='$href'>Link</a>";

    La definición de funciones o métodos para tales casos a menudo también tiene sentido.

    Los bloques de control no devuelven "resultados"

    Ahora esto es menos común, pero algunos codificadores incluso tratan de tratar ifcomo si pudiera devolver un resultado :

    $var = if ($x == $y) { "true" };

    Que es estructuralmente idéntico al uso ifdentro de una concatenación / expresión de cadena.

    • Pero las estructuras de control (if / foreach / while) no tienen un "resultado" .
    • La cadena literal "verdadero" también sería una declaración nula.

    Tendrás que usar una tarea en el bloque de código :

    if ($x == $y) { $var = "true"; }

    Alternativamente, recurra a una ?:comparación ternaria.

    Si en si

    Usted no puede un nidoif dentro de una condición ya sea:

                        
    if ($x == true and (if $y != false)) { ... }

    Lo que obviamente es redundante, porque and(o or) ya permite encadenar comparaciones.

  3. ;Punto y coma olvidado

    Una vez más: cada bloque de control debe ser una declaración. Si el código anterior no termina con un punto y coma, entonces ese es un error de sintaxis garantizado:

                    
    $var = 1 + 2 + 3
    if (true) {  }

    Por cierto, la última línea en un {…}bloque de código también necesita un punto y coma.

  4. Punto y coma demasiado temprano

    Ahora probablemente sea incorrecto culpar a un estilo de codificación en particular, ya que esta trampa es demasiado fácil de pasar por alto:

                
    if ($x == 5);
    {
        $y = 7;
    }
    else           
    {
        $x = -1;    
    }

    Lo que sucede con más frecuencia de lo que puedas imaginar.

    • Cuando termina la if ()expresión con; ella, se ejecutará una declaración nula. ¡El se ;convierte en un vacío {}propio!
    • El {…}bloque, por lo tanto, se separa del if, y siempre se ejecutará.
    • Por lo tanto, elseya no tenía una relación con una ifconstrucción abierta , por lo que esto conduciría a un error de sintaxis T_ELSE inesperado.

    Lo que también explica una variación igualmente sutil de este error de sintaxis:

    if ($x) { x_is_true(); }; else { something_else(); };

    Donde ;después del bloque de código {…}termina la if construcción completa , cortando la elserama sintácticamente.

  5. No usar bloques de código

    Está sintácticamente permitido omitir llaves {... }para bloques de código en if/ elseif/ elseramas. Que lamentablemente es un estilo de sintaxis muy común para los codificadores no invertidos. (Bajo el supuesto falso, esto fue más rápido de escribir o leer).

    Sin embargo, es muy probable que dispare la sintaxis. Tarde o temprano, declaraciones adicionales encontrarán su camino en las ramas if / else:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     
    else
        $z = 0;

    Pero para usar bloques de código, ¡tienes que escribirlos {... }como tales!

    Incluso los programadores experimentados evitan esta sintaxis sin llaves, o al menos la entienden como una excepción excepcional a la regla.

  6. Else / Elseif en orden incorrecto

    Una cosa para recordar es el orden condicional , por supuesto.

    if ($a) {  }
    else {  }
    elseif ($b) {  }
    

    Puede tener tantos elseifs como desee, pero elsetiene que ir al final . Así es como es.

  7. Declaraciones de clase

    Como se mencionó anteriormente , no puede tener declaraciones de control en una declaración de clase:

    class xyz {
        if (true) {
            function ($var) {}
        }

    O bien olvidó una definición de función , o cerró una }demasiado pronto en tales casos.

  8. Inesperado T_ELSEIF / T_ELSE

    Al mezclar PHP y HTML, el cierre }para un if/elseifdebe estar en el mismo bloque PHP <?php ?>que el siguiente elseif/else. Esto generará un error ya que el cierre }de las ifnecesidades debe ser parte de elseif:

    <?php if ($x) { ?>
        html
    <?php } ?>
    <?php elseif ($y) { ?>
        html
    <?php } ?>

    La forma correcta <?php } elseif:

    <?php if ($x) { ?>
        html
    <?php } elseif ($y) { ?>
        html
    <?php } ?>

    Esto es más o menos una variación de sangría incorrecta, probablemente basada en intenciones de codificación incorrectas.
    No puede mezclar otras declaraciones intermedias if y elseif/ o elsetokens estructurales:

    if (true) {
    }
    echo "in between";    
    elseif (false) {
    }
    ?> text <?php      
    else {
    }

    O bien solo puede ocurrir en {…}bloques de código, no entre tokens de estructura de control.

    • Esto no tendría sentido de todos modos. No es que hubiera un estado "indefinido" cuando PHP salta entre ify se elsebifurca.
    • Tendrá que decidir dónde pertenecen las declaraciones de impresión / o si deben repetirse en ambas ramas.

    Tampoco puede separar un if / else entre diferentes estructuras de control:

    foreach ($array as $i) {
        if ($i) {  }
    }
    else {  }

    No existe una relación sintáctica entre ify else. El foreachalcance léxico termina en }, por lo que no tiene sentido que la ifestructura continúe.

  9. T_ENDIF

    Si se queja un T_ENDIF inesperado, está utilizando el estilo de sintaxis alternativo if:elseif:else:endif;. En lo que realmente deberías pensar dos veces.

    • Un error común es confundir el colon misteriosamente similar :para un ;punto y coma . (Cubierto en "Punto y coma demasiado temprano")

    • Como la sangría es más difícil de rastrear en los archivos de plantilla, más cuando se usa la sintaxis alternativa: es plausible endif;que no coincida con ninguna if:.

    • El uso } endif; es un terminador doble if .

    Mientras que un "final inesperado de $" suele ser el precio de una }llave de cierre olvidada .

  10. Asignación versus comparación

    Entonces, este no es un error de sintaxis, pero vale la pena mencionarlo en este contexto:

           
    if ($x = true) { }
    else { do_false(); }

    Eso no es un ==/ ===comparación, sino una =asignación . Esto es bastante sutil, y llevará fácilmente a algunos usuarios a editar impotentes bloques de condiciones completas. Tenga cuidado con las tareas no intencionadas primero, siempre que experimente un error lógico / mal comportamiento.

mario
fuente
11

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 como ifexpresiones. Si el analizador se queja de ellos, a menudo significa un emparejamiento incorrecto o ( )parens no coincidentes a su alrededor.

  1. Agrupación de Parens

    En particular, para las ifdeclaraciones con comparaciones múltiples, debe tener cuidado de contar correctamente los paréntesis de apertura y cierre :

                            
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          

    Aquí la ifcondición aquí ya fue terminada por el)

    Una vez que sus comparaciones se vuelven lo suficientemente complejas, a menudo ayuda dividirlas en ifconstrucciones múltiples y anidadas .

  2. isset () mezclado con comparación

    Un recién llegado común es pitfal que intenta combinar isset()o empty()con comparaciones:

                            
    if (empty($_POST["var"] == 1)) {

    O incluso:

                        
    if (isset($variable !== "value")) {

    Esto no tiene sentido para PHP, ya que issety emptyson construcciones del lenguaje que sólo aceptan los nombres de variables. Tampoco tiene sentido comparar el resultado, porque la salida es solo / ya booleana.

  3. Confuso >=mayor o igual con el =>operador de matriz

    Ambos operadores se ven algo similares, por lo que a veces se mezclan:

             
    if ($var => 5) { ... }

    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

  4. Nada contra lo que comparar

    Tampoco puede combinar dos comparaciones si pertenecen al mismo nombre de variable:

                     
    if ($xyz > 5 and < 100)

    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

  5. Cadenas de comparación

    No se puede comparar con una variable con una fila de operadores:

                      
     $reult = (5 < $x < 10);

    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.

  6. Inesperado >
    Inesperado<

    Los operadores mayor >o menor que <no tienen un T_XXXnombre 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:

                            
    print "<a href='z">Hello</a>";
                     ↑

    Esto equivale a una cadena que "<a href='z"se compara >con una constante literal Helloy 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:

    <?php echo <?php my_func(); ?>

Ver también:

mario
fuente
11

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, echosólo se puede utilizar como declaraciones. Suelen residir en una línea solos.

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

                 
    $x = myfunc()
    if (true) {

    Solución: busque en la línea anterior; Añadir punto y coma.

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

    class xyz {
        if (true) {}
        foreach ($var) {}

    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.

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

                       
    $var = array(1, 2, foreach($else as $_), 5, 6);

    Del mismo modo, no puede usar un ifen cadenas, expresiones matemáticas o en otro lugar:

                   
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.

    Para incrustar ifcondiciones similares en una expresión específicamente, a menudo desea utilizar una ?:evaluación ternaria .

    Lo mismo se aplica a for, while, global, echoy en menor medida list.

              
    echo 123, echo 567, "huh?";

    Mientras que print()es un lenguaje incorporado que puede usarse en el contexto de expresión. (Pero rara vez tiene sentido).

  4. Palabras clave reservadas como identificadores

    Tampoco puede usar dou ifotras 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).

Mario
fuente
7

Inesperado '?'

Si está intentando utilizar el operador de fusión nula ??en una versión de PHP anterior a PHP 7, obtendrá este error.

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

Inesperado '?', Esperando variable

Un error similar puede ocurrir para los tipos anulables, como en:

function add(?int $sum): ?int {

Lo que nuevamente indica que se está utilizando una versión de PHP desactualizada (ya sea la versión CLI php -vo el servidor web vinculado phpinfo();).

John Conde
fuente
5

T_LNUMBER inesperado

El token se T_LNUMBERrefiere a un "largo" / número.

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

    $1   // Bad
    $_1  // Good

    * *

    • Muy a menudo surge el uso de preg_replacemarcadores "$1"de posición en contexto PHP:

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )

      Donde la devolución de llamada debería haber sido citada. (Ahora, la /ebandera de expresiones regulares ha quedado en desuso. Pero a veces todavía se usa incorrectamente en las preg_replace_callbackfunciones).

    • La misma restricción de identificador se aplica a las propiedades del objeto , por cierto.

             
      $json->0->value
    • Si bien el tokenizer / parser no permite un literal $1como 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 literal 1).

  2. Entrada de matriz perdida

    También puede ocurrir un largo inesperado para las declaraciones de matriz , cuando faltan ,comas:

    #            ↓ ↓
    $xy = array(1 2 3);

    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.

  3. HTML mal citado

    Y nuevamente, las cadenas mal citadas son una fuente frecuente de números extraviados:

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";

    Dichos casos deben tratarse más o menos como errores T_STRING inesperados .

  4. Otros identificadores

    Ni las funciones, las clases ni los espacios de nombres se pueden nombrar comenzando con un número:

             
    function 123shop() {

    Más o menos lo mismo que para los nombres de variables.

Mario
fuente
2

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:

Los nombres de las variables siguen las mismas reglas que otras etiquetas en PHP. Un nombre de variable válido comienza con una letra o un guión bajo, seguido de cualquier número de letras, números o guiones bajos. Como expresión regular, se expresaría así: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

John Conde
fuente
Buena adición John.
Funk Forty Niner
1

'Continuar' inesperado (T_CONTINUE)

continuees 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 continueque 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 nivel foreacho un ifbloque).

'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);;

Mario
fuente
1

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:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

En PHP 7.4, podría usarlo para expresiones de matriz .

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
John Conde
fuente
0

Inesperado 'fin del tiempo' (T_ENDWHILE)

La sintaxis utiliza dos puntos; si no hay dos puntos, se producirá el error anterior.

<?php while($query->fetch()): ?>
 ....
<?php endwhile; ?>

La alternativa a esta sintaxis es usar llaves:

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/en/control-structures.while.php

mplungjan
fuente
0

Un mensaje de error que comienza Parse error: syntax error, unexpected ':'puede ser causado al escribir por error una referencia estática de clase Class::$Variablecomo Class:$Variable.

David Spector
fuente