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:
- Unexpected T_STRING
- Inesperado T_VARIABLE
Inesperado '$varname' (T_VARIABLE)- Unexpected T_CONSTANT_ENCAPSED_STRING
Unexpected T_ENCAPSED_AND_WHITESPACE](https://stackoverflow.com/a/18092288)- Unexpected $end
- Unexpected T_FUNCTION...
- Unexpected
{
Unexpected}
Unexpected(
Unexpected)
](https://stackoverflow.com/a/18092308)- Unexpected
[
Unexpected]
](https://stackoverflow.com/a/29505827)- Inesperado T_IF
Inesperado T_FOREACH
Inesperado T_FOR
Inesperado T_WHILE
Inesperado T_DO
Inesperado T_PRINT
Inesperado T_ECHO- Unexpected T_LNUMBER
- Inesperado?
- Unexpected continue (T_CONTINUE)
Unexpected continue (T_BREAK)
Unexpected continue (T_RETURN)](//stackoverflow.com/a/51786865)- Inesperado '='
- Unexpected T_INLINE_HTML...
- Inesperado T_PAAMAYIM_NEKUDOTAYIM...
- Inesperado T_OBJECT_OPERATOR...
- Unexpected T_DOUBLE_ARROW...
- Unexpected T_SL...
- Unexpected T_BOOLEAN_OR...
Unexpected T_BOOLEAN_AND...- Inesperado T_IS_EQUAL
Inesperado T_IS_GREATER_OR_EQUAL
Inesperado T_IS_IDENTICAL
Inesperado T_IS_NÃO_EQUAL
Inesperado T_IS_NOT_IDENTICAL
Inesperado T_IS_SMALLER_OR_EQUAL
Inesperado<
Inesperado>
- Unexpected T_NS_SEPARATOR...
- Caracteres inesperados na entrada: '
\
' (ASCII=92) state=1- Inesperado 'public' (T_PUBLIC)
Inesperado 'private' (T_PRIVATE)
Inesperado 'protected' (T_PROTECTED)
Inesperado 'final' (T_FINAL)](https://stackoverflow.com/questions/13341378/php-parse-error-syntax-error-unexpected-t-public)...- Unexpected T_STATIC...
- Unexpected T_CLASS...
- Unexpected T_DNUMBER
- Inesperado
,
](https://stackoverflow.com/questions/29241208/php-parse-error-syntax-error-unexpected-in) (comma)- Unpexected
.
(período)- Inesperado
;
(ponto-e-vírgula)- Unexpected
*
(asterisco)- Inesperado
:
(cólon) Referências estreitamente relacionadas:- O que significa este erro em PHP? (erros em tempo de execução)
- Parse error: syntax error, unexpected T_XXX
- Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE
- Parse error: syntax error, unexpected T_VARIABLE
- O que significa este símbolo em PHP? (tokens de linguagem)
- Aquelas citações "inteligentes" não significam nada para o PHP](https://stackoverflow.com/questions/14303353/double-quotes-are-not-copied-normally-how-can-i-edit-them) E..:
- 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.
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:
Abra o arquivo fonte mencionado. Veja a linha de código*** mencionada.
Mais regularmente você precisa olhar linhas precedentes também.
;
ponto-e-vírgula nas extremidades/etapas anteriores. (Pelo menos do ponto de vista estilístico. ){
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***!
+-*/.
também devem ser coloridos de forma distinta. Caso contrário, eles podem estar no contexto errado."
ou'
sem forma ou sem forma.++
,--
, 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.
if' em condições distintas ou aninhadas
if'.Particionar blocos de código longos realmente ajuda a localizar a origem dos erros de sintaxe.
Comente o código ofensivo.
Como um recém-chegado, evite algumas das confusas construções de sintaxe.
? :
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.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:
;
para declarações/linhas terminadas."
ou'
e citações não escalonadas dentro..
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.
Restaure um backup do código que funcionava anteriormente, se você puder't corrigi-lo.
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.
Cuidar de quais tipos de quebra de linha são salvos em arquivos.
//
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:
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 seuphp.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, digamostest.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'serror.log
quando um script trava com as respostas do HTTP 500.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.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:
String concatenation
Um percalço freqüente são concatenações de cordas com o esquecido
.
operador: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.
Operadores de expressão em falta
Claro que a mesma questão pode surgir em outras expressões, por exemplo, operações aritméticas:
PHP can't guess aqui se a variável deveria ter sido adicionada, subtraída ou comparada, etc.
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:Ou listas de parâmetros de funções:
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".
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:
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.
Variáveis após identificadores
Você também nunca pode ter uma variável seguindo um identificador diretamente:
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.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":
Solução: adicionar a abertura em falta
(
entre o comando e a variável.Else não espera condições
Solução: Remover as condições de
else
ou utilizarelseif
.Necessidade de parênteses para fechamento
Solução: Adicionar parênteses em torno de
$var
.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:
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
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 debare
palavras a sobras deCONSTANT
ou nomes de funções, strings esquecidas não citadas, ou qualquer texto simples.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*.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.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.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.short open tags and
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.<?xml
cabeçalhos em scripts PHPInvisible 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.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.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