Erros de sintaxe em PHP; e como resolvê-los?

Todos se deparam com erros de sintaxe. Até mesmo programadores experientes fazem erros de digitação. Para os recém-chegados, it's é apenas parte do processo de aprendizagem. No entanto, it's frequentemente é fácil de interpretar mensagens de erro, tais como:

PHP Parse error: erro de sintaxe, inesperado '{'in index.php on line 20 O símbolo inesperado é'nem sempre o verdadeiro culpado. Mas o número da linha dá uma ideia aproximada de onde começar a procurar. olhe sempre para o contexto do código*. O erro de sintaxe muitas vezes se esconde nas mencionadas ou nas linhas de código anteriores*. Compare o seu código com exemplos de sintaxe do manual. Embora nem todos os casos coincidam com os outros. No entanto, existem alguns passos gerais para solver erros de sintaxe. Estas referências resumem as armadilhas comuns:

  • O manual PHP em php.net e seus vários tokens de linguagem
  • Ou Wikipedia's introdução de sintaxe em PHP.
  • E por último a nossa **php*** tag-wiki, claro. Enquanto o Stack Overflow também está recebendo codificadores novatos, ele's tem como alvo principalmente questões profissionais de programação.
  • Responder a todos's erros de codificação e erros de digitação estreitos é considerado principalmente fora do tópico.
  • Então, por favor, tome um tempo para seguir os passos básicos, antes de postar pedidos de correção de sintaxe.
  • Se você ainda tiver que fazê-lo, por favor mostre sua própria iniciativa de resolução, tentativas de correção, e seu processo de pensamento sobre o que parece ou pode estar errado. Se o seu browser exibe mensagens de erro como "SyntaxError: illegal character", então it's not actually [tag:php]-related, but a [tag:javascript]-syntax error.

    **Finalmente, considere que se o erro de sintaxe não foi levantado ao editar sua base de códigos, mas após a instalação ou atualização de um pacote de um fornecedor externo, pode ser devido à incompatibilidade da versão PHP, então verifique os requisitos do fornecedor's em relação à configuração de sua plataforma.

Solução

Quais são os erros de sintaxe?

O PHP pertence às linguagens de programação estilo C e imperativo. Ele tem regras gramaticais rígidas, das quais não pode se recuperar ao encontrar símbolos ou identificadores equivocados. Ele pode't adivinhar suas intenções codificadoras. .

Dicas mais importantes

Há algumas precauções básicas que você pode sempre tomar:

  • Use a indentação código adequado, ou adopte qualquer estilo de codificação elevado. A legibilidade evita irregularidades.

  • Use um *IDE** ou editor para PHP com **syntax highlighting***. O que também ajuda no balanceamento entre parênteses/braquetes.

  • Leia a referência do idioma e exemplos no manual. Duas vezes, para se tornar um pouco proficiente.

    Como interpretar os erros do analisador

    Uma mensagem de erro de sintaxe típica lê-se:

    Parse error: syntax error, unexpected T_STRING, expecting ';' in file.php on line 217 Que lista a localização possível de um erro de sintaxe. Veja o mencionado nome do arquivo e número da linha. Um moniker como T_STRING explica qual símbolo o parser/tokenizer poderia't processar finalmente. Isto é't necessariamente a causa do erro de sintaxe, no entanto. É importante olhar em **linhas de código anteriores*** também. Muitas vezes os erros de sintaxe são apenas contratempos que aconteceram anteriormente. O número da linha de erro é exatamente onde o analisador conclusivamente desistiu para processar tudo.

    Resolvendo erros de sintaxe

    Há muitas abordagens para reduzir e corrigir os soluços de sintaxe.

  • Abra o arquivo fonte mencionado. Veja a linha de código*** mencionada.

    • Para strings em fuga e operadores mal colocados, normalmente é aqui que você encontra o culpado.
    • Leia a linha da esquerda para a direita e imagine o que cada símbolo faz.
  • Mais regularmente você precisa olhar linhas precedentes também.

    • Em particular, faltam ; ponto-e-vírgula nas extremidades/etapas anteriores. (Pelo menos do ponto de vista estilístico. )
    • Se { blocos de código } estiverem incorretamente fechados ou aninhados, você pode precisar investigar ainda mais acima o código fonte. Use a indentação apropriada de código para simplificar isso.
  • Veja a colorização de **syntax***!

    • Strings, variáveis e constantes devem todas ter cores diferentes.
    • Os operadores +-*/. também devem ser coloridos de forma distinta. Caso contrário, eles podem estar no contexto errado.
    • Se você vir que a colorização de strings se estende muito longe ou muito curta, então você encontrou um marcador de strings " ou ' sem forma ou sem forma.
    • Ter dois caracteres de pontuação da mesma cor ao lado um do outro também pode significar problemas. Normalmente, os operadores são solitários se's não é ++, --, ou parênteses seguindo um operador. Duas cordas/identificadores que se seguem diretamente um ao outro são incorretos na maioria dos contextos.
  • **O espaço em branco é seu amigo**. Siga qualquer* estilo de codificação.

  • Separar linhas longas temporariamente.

    • Você pode livremente adicionar novas linhas entre operadores ou constantes e cordas. O analisador irá então concretizar o número da linha para erros de análise. Ao invés de olhar para o código muito longo, você pode isolar o símbolo de sintaxe em falta ou mal colocado.
    • Dividir as complexas instruções if' em condições distintas ou aninhadasif'.
    • Ao invés de fórmulas matemáticas longas ou cadeias lógicas, use variáveis temporárias para simplificar o código. (Mais legível = menos erros).
    • Adicione novas linhas entre:
      1. O código que você pode facilmente identificar como correto,
      2. As partes que você'estão inseguras sobre,
      3. E as linhas de que o analisador se queixa.
        Particionar blocos de código longos realmente ajuda a localizar a origem dos erros de sintaxe.
  • Comente o código ofensivo.

    • Se você pode't isolar o código fonte do problema, comece a comentar (e assim remover temporariamente) os blocos de código.
    • Assim que você se livrar do erro de análise, você terá encontrado o código fonte do problema. Olhe mais de perto lá.
    • Às vezes você quer remover temporariamente blocos completos de função/método. (No caso de suportes curvados inigualáveis e código recuado incorretamente).
    • Quando você pode't resolver o problema de sintaxe, tente rewrite as seções comentadas do zero.
  • Como um recém-chegado, evite algumas das confusas construções de sintaxe.

    • O operador de condições ternárias ? : pode compactar código e é de fato útil. Mas ele não't ajuda na legibilidade em todos os casos. Prefira instruções simples de 'if' enquanto não está em uso.
    • A sintaxe alternativa do PHP's (if:/elseif:/endif;) é comum para os templates, mas indiscutivelmente menos fácil de seguir do que os blocos normais { code }.
  • Os erros mais prevalentes para os recém-chegados são:

    • Ponto-e-vírgula em falta ; para declarações/linhas terminadas.
    • Citações de cadeia de caracteres não correspondentes para " ou ' e citações não escalonadas dentro.
    • Operadores esquecidos, em particular para a string . concatenação.
    • ( parênteses ) não balanceados. Conte-os na linha relatada. Há um número igual deles?
  • Don'não se esqueça que resolvendo um problema de sintaxe pode descobrir o próximo.

    • Se você fizer um problema desaparecer, mas outras colheitas em algum código abaixo, você'está na maioria das vezes no caminho certo.
    • Se depois de editar um novo erro de sintaxe aparecer na mesma linha, então a sua tentativa de alteração foi possivelmente um fracasso. (Nem sempre, porém).
  • Restaure um backup do código que funcionava anteriormente, se você puder't corrigi-lo.

    • Adote um sistema de versão de código fonte. Você sempre pode ver um diff da versão quebrada e da última versão funcional. O que pode ser esclarecedor quanto a qual é o problema de sintaxe.
  • **Invisible stray Unicode characters***: Em alguns casos, você precisa usar um hexeditor ou um editor/visualizador diferente na sua fonte. Alguns problemas não podem ser encontrados apenas por olhar para o seu código.

    • Tente [grep --color -P -n "\x80-xFF]" file.php`]9 como a primeira medida para encontrar símbolos não-ASCII.
    • Em particular listas técnicas, espaços de largura zero, ou espaços não quebrados, e citações inteligentes regularmente podem encontrar o seu caminho para o código fonte.
  • Cuidar de quais tipos de quebra de linha são salvos em arquivos.

    • PHP apenas honra \n novas linhas, não \r devoluções de carruagens.
    • O que ocasionalmente é um problema para utilizadores de MacOS (mesmo em OS  X para editores mal configurados).
    • Muitas vezes ele só aparece como um problema quando são utilizados comentários de uma única linha // ou #. Comentários de múltiplas linhas /*...*/ raramente perturbam o analisador quando as quebras de linha são ignoradas.
  • Se o seu syntax error não transmite através da web: Acontece que você tem um erro de sintaxe na sua máquina. Mas postar o mesmo arquivo online não o exibe mais. O que só pode significar uma de duas coisas:

    • Você está a olhar para o ficheiro errado!
    • Ou o seu código continha Unicode invisível perdido (veja acima). Você pode descobrir facilmente: Basta copiar o seu código de volta do formulário web para o seu editor de texto.
  • Verifique a sua **versão PHP***. Nem todas as construções de sintaxe estão disponíveis em todos os servidores.

    • php -v para o interpretador de linha de comando
    • <?php phpinfo(); para aquele invocado através do webserver.
      Essas são't necessariamente as mesmas. Em particular, quando se trabalha com frameworks, você os fará corresponder.
  • Don't use PHP's reserved keywords como identificadores de funções/métodos, classes ou constantes.

  • Trial-and-error é o seu último recurso. Se tudo o resto falhar, pode sempre **google*** a sua mensagem de erro. Os símbolos de sintaxe são't tão fáceis de pesquisar (o próprio Stack Overflow é indexado por SymbolHound no entanto). Portanto, pode ser necessário procurar em mais algumas páginas antes de encontrar algo relevante. Mais guias:

  • PHP Debugging Basics por David Sklar

  • Fixing PHP Errors por Jason McCreary

  • Erros PHP - 10 Erros Comuns por Mario Lurig

  • Erros e soluções comuns em PHP

  • Como solucionar problemas e corrigir seu site WordPress

  • Um Guia para Mensagens de Erro PHP para Designers - Revista Smashing

    Tela branca da morte

    Se o seu site está apenas em branco, então normalmente um erro de sintaxe é a causa. Habilite sua exibição com:

    • error_reporting = E_ALL
    • display_errors = 1 No seu php.ini geralmente, ou via .htaccess para o mod_php, ou mesmo .user.ini com as configurações do FastCGI. Habilitá-lo dentro do script quebrado é muito tarde porque o PHP pode'nem mesmo interpretar/executar a primeira linha. Uma alternativa rápida é criar um script wrapper, digamos test.php:
<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

Em seguida, invoque o código de falha acessando este script de invocação. Ele também ajuda a habilitar o PHP's error_log e olhar no seu webserver's error.log quando um script trava com as respostas do HTTP 500.

Comentários (2)

Inesperado T_VARIABLE

An "inesperado T_VARIABLE" significa que há'é um nome literal $variável, que não'não se encaixa na estrutura atual de expressão/exposição.

  1. Semicolon

    Indica mais comumente um ponto-e-vírgula ausente na linha anterior. As atribuições de variáveis após uma declaração são um bom indicador para onde olhar:

            ⇓
     func1()
     $var = 1 + 2; # erro de parse na linha +2
  2. String concatenation

    Um percalço freqüente são concatenações de cordas com o esquecido . operador:

                                    ⇓
     print "Aqui vem o valor: " $value;

    Btw, você deve preferir interpolação de strings (variáveis básicas entre aspas duplas) sempre que isso ajudar a legibilidade. O que evita estes problemas de sintaxe.

    A interpolação de strings é uma característica central do scripting language. Não há vergonha em utilizá-la. Ignore qualquer conselho de micro-optimização sobre a variável . concatenação sendo rápida. Não é's não.

  3. Operadores de expressão em falta

    Claro que a mesma questão pode surgir em outras expressões, por exemplo, operações aritméticas:

                ⇓
     imprimir 4 + 7 $var;

    PHP can't guess aqui se a variável deveria ter sido adicionada, subtraída ou comparada, etc.

  4. Lists

    O mesmo para listas de sintaxe, como nas populações de array, onde o analisador também indica uma vírgula , esperada, por exemplo:

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

    Ou listas de parâmetros de funções:

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

    Da mesma forma, você vê isso com declarações de "lista" ou "global", ou quando falta um ponto-e-vírgula em um loop de "para".

  5. Declarações de classe

    Este erro de análise também ocorre em declarações de classe. Você só pode atribuir constantes estáticas, não expressões. Assim, o analisador reclama das variáveis como dados atribuídos:

     classe xyz { ⇓
         var $valor = $_GET["input"];

    O fechamento inigualável dos suportes de cabelo encaracolado pode, em particular, conduzir aqui. Se um método é terminado muito cedo (use indentação apropriada!), então uma variável perdida é normalmente mal colocada no corpo de declaração de classe.

  6. Variáveis após identificadores

    Você também nunca pode ter uma variável seguindo um identificador diretamente:

                  ⇓
     $this->myFunc$VAR();

    Btw, este é um exemplo comum onde a intenção era usar variáveis talvez. Neste caso, uma pesquisa de propriedade de variável com $this->{"myFunc$VAR"}(); por exemplo.

    Tenha em mente que o uso de variáveis variáveis deve ser a exceção. Os recém-chegados muitas vezes tentam usá-las de forma muito casual, mesmo quando as arrays seriam mais simples e mais apropriadas.

  7. Falta de parênteses após construções linguísticas

    A digitação precipitada pode levar a parênteses de abertura esquecidos para declarações de "se" e "para" e "para cada":

            ⇓
     Foreach $array como $key) {

    Solução: adicionar a abertura em falta ( entre o comando e a variável.

  8. Else não espera condições

          ⇓
     senão ($var >= 0)

    Solução: Remover as condições de else ou utilizar elseif.

  9. Necessidade de parênteses para fechamento

          ⇓
     function() utiliza $var {}

    Solução: Adicionar parênteses em torno de $var.

  10. Invisible whitespace

    Como mencionado na resposta de referência em "Invisible stray Unicode" (como um espaço não quebrado), você também pode ver este erro para código insuspeito como:

     <?php
                               ⇐
     $var = nova DOP(...);

    It's bastante predominante no início dos arquivos e para código copiado e colado. Verifique com um hexeditor, se seu código não parece conter visualmente um problema de sintaxe.

Ver também

Comentários (0)

Inesperado T_STRING

"T_STRING" é um nome um pouco errado. Ele não se refere a um "string". Significa que um identificador bruto foi encontrado. Isto pode variar de bare palavras a sobras de CONSTANT ou nomes de funções, strings esquecidas não citadas, ou qualquer texto simples.

  1. Strings mal citadas

    Este erro de sintaxe é mais comum para valores de strings mal citadas, no entanto. Qualquer `"` ou `'` quote não citada e desgarrada irá formar uma expressão inválida: ⇓ ⇓ echo "clique aqui"; O realce da sintaxe fará com que tais erros sejam super óbvios. It's important to remember to use backslashes for escape `\"` double quotes, ou `\'` single quotes - dependendo de qual foi utilizado como [string enclosure][1]. - Por conveniência, você deve preferir aspas simples externas quando sair HTML simples com aspas duplas dentro. - Utilize aspas duplas se você quiser interpolar variáveis, mas depois tenha cuidado para escapar de literais `"` aspas duplas. - Para saída mais longa, prefira múltiplas linhas `echo`/`print` em vez de escapar de dentro e fora. Melhor ainda considerar uma seção [HEREDOC][2]. Veja também *https://stackoverflow.com/questions/3446216/what-is-the-difference-between-single-quoted-and-double-quoted-strings-in-php*.
  2. Unclosed strings

    Se você [perder um fechamento `"`][3] então um erro de sintaxe tipicamente se materializa mais tarde. Uma string não terminada irá frequentemente consumir um pouco de código até o próximo valor pretendido para a string: ⇓ echo "Alguns textos", $a_variable, "e alguma string fugitiva ; sucesso("terminado"); ⇯ It's não é apenas literal `T_STRING`s que o analisador pode protestar então. Outra variação frequente é um [`Unexpected '>'`](https://stackoverflow.com/questions/6507796/troubleshooting-parse-error-unexpected-error) para HTML literal não cotado.
  3. Non-programming string quotes

    Se você *copiar e colar* código de um blog ou website, às vezes você acaba com código inválido. [Citações tipográficas são't][4] o que o PHP espera: $text = 'Alguma coisa...' + "estas ain't quotes"; As citações tipográficas/smart são símbolos Unicode. O PHP as trata como parte de um texto alfanumérico adjacente. Por exemplo `"estas" são interpretadas como um identificador constante. Mas qualquer texto seguinte literal é então visto como uma palavra de barra/T_STRING pelo analisador.
  4. O ponto e vírgula ausente; novamente

    Se você tiver uma expressão não terminada nas linhas anteriores, então qualquer expressão ou construção de linguagem a seguir é vista como um identificador bruto: ⇓ func1() função2(); PHP apenas pode'não sabe se você pretendia executar duas funções após outra, ou se pretendia multiplicar os seus resultados, adicioná-los, compará-los, ou executar apenas uma `|||| ou a outra.
  5. short open tags and <?xml cabeçalhos em scripts PHP

    Isto é bastante incomum. Mas se as tags short_open_tags estiverem habilitadas, então você pode't iniciar seus scripts PHP [com uma declaração XML][5]: ⇓ <?xml version="1.0"?> PHP vai ver o `<?` e recuperá-lo para si mesmo. Ele ganhou't entendeu para que era destinado o `xml' perdido. It'será interpretado como constante. Mas a `version` será vista como outra literal/constante. E como o parser pode't fazer sentido de dois literais/valores subsequentes sem um operador de expressão no meio, isso'será um fracasso do parser.
  6. Invisible Unicode characters

    A causa mais hedionda para erros de sintaxe são símbolos Unicode, tais como o [non-breaking space][6]. O PHP permite caracteres Unicode como nomes identificadores. Se você receber uma reclamação de T_STRING parser para código totalmente insuspeito como: <?php impressão 123; Tens de arranjar outro editor de texto. Ou até mesmo um hexeditor. O que parece ser espaços simples e novas linhas aqui, pode conter constantes invisíveis. IDEs baseadas em Java às vezes são alheias a uma BOM UTF-8 mangled dentro, espaços de largura zero, separadores de parágrafos, etc. Tente reeditar tudo, remover espaços em branco e adicionar espaços normais de volta. Você pode estreitá-lo com a adição de separadores de comandos redundantes `;` em cada início de linha: <?php ;print 123; O ponto-e-vírgula extra `;` aqui irá converter o caracter invisível precedente em uma referência constante indefinida (expressão como declaração). O que em troca faz o PHP produzir um aviso útil.
  7. O sinal `$` faltando na frente dos nomes das variáveis

    [Variáveis no PHP][7] são representadas por um sinal de dólar seguido pelo nome da variável. O sinal do dólar (`$`) é um [sigil][8] que marca o identificador como nome de uma variável. Sem este sinal, o identificador poderia ser uma [language keyword][9] ou uma [constante][10]. Este é um erro comum quando o código PHP era ["translated" de código escrito em outra linguagem][11] (C, Java, JavaScript, etc.). Nesses casos, uma declaração do tipo de variável (quando o código original foi escrito em uma linguagem que usa variáveis digitadas) também poderia sair sorrateiramente e produzir esse erro.
  8. Escaped Quotation marks

    Se você utilizar `\` em uma string, isso tem um significado especial. Isto é chamado de "[Escape Character][12]" e normalmente diz ao analisador para levar o próximo caracter literalmente. Exemplo: `echo 'Jim disse \'Hello\'';`irá imprimir `Jim disse 'hello'` Se você escapar da citação final de uma string, a citação final será tomada literalmente e não como pretendido, ou seja, como uma citação imprimível como parte da string e não fechar a string. Isto irá aparecer como um erro de parse normalmente depois de abrir a próxima string ou no final do script. Erro muito comum quando especificando caminhos no Windows: `"C:\xampp\htdocs\"` está errado. Você precisa de `"C:|xampphtdocs|"`. http://php.net/language.types.string
Comentários (0)