Todo mundo corre para erros de sintaxe. Até programadores experientes cometem erros de digitação. Para os novatos, é apenas parte do processo de aprendizado. No entanto, geralmente é fácil interpretar mensagens de erro como:
Erro de análise do PHP: erro de sintaxe, '{' inesperado em index.php na linha 20
O símbolo inesperado nem sempre é o verdadeiro culpado. Mas o número da linha fornece uma idéia aproximada de onde começar a procurar.
Sempre observe o contexto do código . O erro de sintaxe geralmente oculta nas linhas de código mencionadas ou nas anteriores . Compare seu código com exemplos de sintaxe do manual.
Embora nem todos os casos correspondam ao outro. No entanto, existem algumas etapas gerais para resolver erros de sintaxe . Essas referências resumiram as armadilhas comuns:
Inesperado T_CONSTANT_ENCAPSED_STRING
Inesperado T_ENCAPSED_AND_WHITESPACECaractere inesperado na entrada: '
\
' (ASCII = 92) state = 1Inesperado
,
(vírgula)Não esperado
.
(período)Inesperado
;
(ponto e vírgula)Inesperado
*
(asterisco)Inesperado
:
(dois pontos)Inesperado
&
(passagem por referência de tempo de chamada)
Referências estreitamente relacionadas:
- O que esse erro significa em PHP? (erros de tempo de execução)
- O que esse símbolo significa em PHP? (tokens de idioma)
- Essas citações
“”
inteligentes‘’
não significam nada para o PHP
E:
- O manual do PHP no php.net e seus vários tokens de linguagem
- Ou a introdução da sintaxe da Wikipedia no PHP .
- E, finalmente, nosso php tag-wiki, é claro.
Embora o Stack Overflow também receba codificadores novatos, ele é voltado principalmente para questões de programação profissional.
- Responder a todos os erros de codificação e erros de digitação restritos é considerado principalmente fora de tópico.
- Portanto, reserve um tempo para seguir as etapas básicas , antes de postar solicitações de correção de sintaxe.
- Se você ainda precisar, mostre sua própria iniciativa de solução, tentativas de correção e seu processo de pensamento sobre o que parece ou pode estar errado.
Se o seu navegador exibir mensagens de erro como "SyntaxError: caractere ilegal", não será realmentephprelacionado, mas um javascript- erro de sintaxe .
Erros de sintaxe gerados no código do fornecedor: Por fim, considere que se o erro de sintaxe não foi gerado editando sua base de código, mas após a instalação ou atualização de um pacote de fornecedor externo, isso pode ocorrer devido à incompatibilidade da versão do PHP, portanto verifique os requisitos do fornecedor em sua plataforma configuração.
fonte
T_IF / T_FOREACH / ...
bloco. Embora eu desejasse compilar um resumo mais personalizado para as perguntas IF / ELSE / ELSEIF.Respostas:
Quais são os erros de sintaxe?
O PHP pertence às linguagens de programação imperativas e de estilo C. Possui regras gramaticais rígidas, das quais não pode ser recuperada ao encontrar símbolos ou identificadores extraviados. Não pode adivinhar suas intenções de codificação.
Dicas mais importantes
Existem algumas precauções básicas que você sempre pode tomar:
Use recuo de código adequado ou adote qualquer estilo de codificação elevado. A legibilidade evita irregularidades.
Use um IDE ou editor para PHP com destaque de sintaxe . O que também ajuda no equilíbrio entre parênteses / colchetes.
Leia a referência do idioma e exemplos no manual. Duas vezes, para se tornar um pouco eficiente.
Como interpretar erros do analisador
Uma mensagem de erro de sintaxe típica é:
Que lista a possível localização de um erro de sintaxe. Veja o nome do arquivo e o número da linha mencionados .
Um apelido como
T_STRING
explica qual símbolo o analisador / tokenizador não pôde processar finalmente. Isso não é necessariamente a causa do erro de sintaxe, no entanto.É importante examinar também as linhas de código anteriores . Frequentemente, erros de sintaxe são apenas acidentes que aconteceram anteriormente. O número da linha de erro é exatamente onde o analisador desistiu conclusivamente para processar tudo.
Resolvendo erros de sintaxe
Existem muitas abordagens para restringir e corrigir soluços de sintaxe.
Abra o arquivo de origem mencionado. Veja a linha de código mencionada .
Para cadeias de fuga e operadores fora do lugar, geralmente é onde você encontra o culpado.
Leia a linha da esquerda para a direita e imagine o que cada símbolo faz.
Mais regularmente, você também precisa observar as linhas anteriores .
Em particular, o
;
ponto e vírgula ausente está ausente nos extremos / instrução da linha anterior. (Pelo menos do ponto de vista estilístico.)Se
{
os blocos de código}
estiverem incorretamente fechados ou aninhados, talvez seja necessário investigar ainda mais o código-fonte. Use recuo de código adequado para simplificar isso.Veja a coloração da sintaxe !
Strings, variáveis e constantes devem ter cores diferentes.
Os operadores também
+-*/.
devem ter tonalidades distintas. Caso contrário, eles podem estar no contexto errado.Se você vir a coloração de uma extensão muito longa ou muito curta, você encontrará um marcador de fechamento
"
ou'
sequência sem escape ou sem escape .Ter dois caracteres de pontuação da mesma cor um ao lado do outro também pode significar problemas. Normalmente, os operadores são solitário, se não é
++
,--
ou parênteses após um operador. Duas seqüências / identificadores que se seguem diretamente estão incorretas na maioria dos contextos.Espaço em branco é seu amigo . Siga qualquer estilo de codificação.
Quebrar linhas longas temporariamente.
Você pode adicionar novas linhas livremente entre operadores ou constantes e seqüências de caracteres. O analisador então concretizará o número da linha para erros de análise. Em vez de examinar o código muito extenso, você pode isolar o símbolo de sintaxe ausente ou extraviado.
Divida
if
instruções complexas emif
condições distintas ou aninhadas .Em vez de longas fórmulas matemáticas ou cadeias lógicas, use variáveis temporárias para simplificar o código. (Mais legível = menos erros.)
Adicione novas linhas entre:
Particionar blocos de código longos realmente ajuda a localizar a origem dos erros de sintaxe.
Comente o código incorreto.
Se você não conseguir isolar a fonte do problema, comece a comentar (e assim remover temporariamente) os blocos de código.
Assim que você se livrou do erro de análise, encontrou a fonte do problema. Olhe mais de perto lá.
Às vezes, você deseja remover temporariamente os blocos completos de função / método. (No caso de chaves sem correspondência e código indentado incorretamente.)
Quando não conseguir resolver o problema de sintaxe, tente reescrever as seções comentadas do zero .
Como recém-chegado, evite algumas construções de sintaxe confusas.
O
? :
operador de condição ternária pode compactar código e é realmente útil. Mas isso não ajuda na legibilidade em todos os casos. Prefiraif
instruções simples enquanto não estiver sendo analisado.A sintaxe alternativa do PHP (
if:
/elseif:
/endif;
) é comum para modelos, mas sem dúvida é menos fácil de seguir do que os blocos de{
código normais}
.Os erros mais comuns de iniciantes são:
Ponto e vírgula ausente
;
para encerrar declarações / linhas.Aspas de sequência não correspondentes para
"
ou as'
aspas sem escape dentro.Operadores esquecidos, em particular para a
.
concatenação de strings .(
Parênteses desequilibrados)
. Contá-los na linha relatada. Existe um número igual deles?Não esqueça que resolver um problema de sintaxe pode descobrir o próximo.
Se você resolver um problema, mas outros surgirem em algum código abaixo, você está no caminho certo.
Se após a edição de um novo erro de sintaxe surgir na mesma linha, a tentativa de alteração foi possivelmente uma falha. (Nem sempre.)
Restaure um backup do código que funcionava anteriormente, se você não conseguir corrigi-lo.
diff
das versões quebrada e última de trabalho. O que pode ser esclarecedor sobre qual é o problema de sintaxe.Caracteres Unicode perdidos invisíveis : em alguns casos, você precisa usar um hexeditor ou editor / visualizador diferente em sua fonte. Alguns problemas não podem ser encontrados apenas olhando o seu código.
Tente
grep --color -P -n "\[\x80-\xFF\]" file.php
como a primeira medida para encontrar símbolos não ASCII.Em particular listas técnicas, espaços de largura zero ou espaços sem quebra e citações inteligentes regularmente podem encontrar o caminho para o código-fonte.
Tome cuidado com o tipo de quebra de linha salva nos arquivos.
O PHP apenas honra \nnovas linhas, não \rretornos de carro.
Ocasionalmente, é um problema para usuários do MacOS (mesmo no OS X para editores mal configurados).
Geralmente, isso só aparece como um problema quando são usados comentários
//
ou linha única#
. Os/*...*/
comentários de várias linhas raramente perturbam o analisador quando as quebras de linha são ignoradas.Se o erro de sintaxe não for transmitido pela Web : Acontece que você possui um erro de sintaxe na sua máquina. Mas postar o mesmo arquivo on-line não o exibe mais. O que pode significar apenas uma de duas coisas:
Você está vendo o arquivo errado!
Ou seu código continha Unicode perdido invisível (veja acima). Você pode descobrir facilmente: basta copiar seu código novamente do formulário da web para o seu editor de texto.
Verifique sua versão do 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 chamado pelo servidor da web.Aqueles não são necessariamente os mesmos. Em particular, ao trabalhar com estruturas, você as fará corresponder.
Não use as palavras-chave reservadas do PHP como identificadores de funções / métodos, classes ou constantes.
Tentativa e erro é seu último recurso.
Se tudo mais falhar, você sempre pode pesquisar sua mensagem de erro no Google . Os símbolos de sintaxe não são tão fáceis de procurar (o Stack Overflow em si é indexado pelo SymbolHound ). Portanto, pode demorar mais algumas páginas para encontrar algo relevante.
Guias adicionais:
Tela branca da morte
Se seu site estiver em branco, normalmente é a causa de um erro de sintaxe. Ative a exibição deles com:
error_reporting = E_ALL
display_errors = 1
No seu
php.ini
geral, ou via.htaccess
mod_php, ou mesmo.user.ini
com configurações FastCGI.Habilitá-lo dentro do script quebrado é tarde demais, porque o PHP nem consegue interpretar / executar a primeira linha. Uma solução rápida é criar um script de wrapper, digamos
test.php
:Em seguida, chame o código com falha acessando esse script do wrapper.
Também ajuda a habilitar o PHP
error_log
e procurar no servidor da weberror.log
quando um script trava com respostas HTTP 500.fonte
error_reporting(E_ALL | E_STRICT);
para versões anteriores do PHPEu acho que esse tópico é totalmente discutido / supercomplicado. Usar um IDE é o caminho a seguir para evitar completamente qualquer erro de sintaxe. Eu diria mesmo que trabalhar sem um IDE não é profissional. Por quê? Porque os IDEs modernos verificam sua sintaxe após cada caractere digitado. Quando você codifica e sua linha inteira fica vermelha, e um grande aviso de aviso mostra o tipo exato e a posição exata do erro de sintaxe, não há absolutamente nenhuma necessidade de procurar outra solução.
Usar um IDE de verificação de sintaxe significa:
Você (efetivamente) nunca mais encontrará erros de sintaxe, simplesmente porque os vê direito ao digitar. A sério.
Excelentes IDEs com verificação de sintaxe (todos disponíveis para Linux, Windows e Mac):
fonte
Inesperado
[
Hoje em dia, o
[
suporte inesperado ao array é comumente visto em versões desatualizadas do PHP. A sintaxe de matriz curta está disponível desde PHP > = 5.4 . Instalações mais antigas suportam apenasarray()
.A desreferencia de resultado da função de matriz também não está disponível para versões mais antigas do PHP:
Referência - O que esse erro significa no PHP? - "Erro de sintaxe inesperado
\[
" mostra as soluções alternativas mais comuns e práticas.No entanto, é sempre melhor atualizar a instalação do PHP. Para planos de hospedagem compartilhada, primeiro pesquise se, por exemplo,
SetHandler php56-fcgi
puder ser usado para ativar um tempo de execução mais recente.Veja também:
BTW, também existem pré-processadores e conversores down da sintaxe do PHP 5.4, se você é realmente exigente com versões mais antigas e lentas do PHP.
Outras causas para erros de sintaxe inesperados
[
Se não é a incompatibilidade da versão do PHP, geralmente é um erro de digitação ou de sintaxe recente:
Você não pode usar declarações / expressões de propriedades de array em classes , nem mesmo no PHP 7.
Confundir
[
com a abertura de chaves{
ou parênteses(
é uma supervisão comum.Ou até:
Ou tentando desreferenciar constantes (antes do PHP 5.6) como matrizes:
Pelo menos o PHP interpreta isso
const
como um nome constante.Se você deseja acessar uma variável de matriz (que é a causa típica aqui), adicione o
$
sigil inicial - para que se torne a$varname
.Você está tentando usar a
global
palavra-chave em um membro de uma matriz associativa. Esta não é uma sintaxe válida:Parêntese quadrado inesperado de
]
fechamentoIsso é um pouco mais raro, mas também há acidentes de sintaxe com o
]
suporte de matriz final .Novamente, incompatibilidades entre
)
parênteses ou}
chaves são comuns:Ou tentando finalizar uma matriz onde não há uma:
O que geralmente ocorre em declarações de matriz com várias linhas e aninhadas .
Nesse caso, use seu IDE para correspondência de colchetes para encontrar qualquer
]
fechamento prematuro da matriz. No mínimo, use mais espaçamento e novas linhas para reduzi-lo.fonte
Inesperado T_VARIABLE
Um "inesperado
T_VARIABLE
" significa que há um$variable
nome literal , que não se encaixa na estrutura atual de expressão / instrução.Faltando ponto-e-vírgula
Geralmente indica um ponto e vírgula ausente na linha anterior. As atribuições variáveis após uma declaração são um bom indicador para onde procurar:
Concatenação de cadeias
Um acidente frequente são as concatenações de strings com o
.
operador esquecido :Aliás, você deve preferir a interpolação de strings (variáveis básicas entre aspas duplas) sempre que isso ajudar na legibilidade. O que evita esses problemas de sintaxe.
Operadores de expressão ausentes
É claro que o mesmo problema pode surgir em outras expressões, por exemplo, operações aritméticas:
O PHP não consegue adivinhar aqui se a variável deveria ter sido adicionada, subtraída ou comparada etc.
Listas
O mesmo para listas de sintaxe, como em populações de matriz, em que o analisador também indica uma vírgula esperada,
,
por exemplo:Ou lista de parâmetros de funções:
Equivalentemente você vê isso com
list
ouglobal
declarações, ou quando falta um;
ponto e vírgula em umfor
loop.Declarações de classe
Este erro do analisador também ocorre nas 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:
}
Chaves de fechamento incomparáveis podem, em particular, levar aqui. Se um método é finalizado muito cedo (use o recuo apropriado!), Uma variável perdida é geralmente extraviada no corpo da declaração de classe.Variáveis após identificadores
Você também nunca pode ter uma variável seguindo diretamente um identificador :
Aliás, este é um exemplo comum em que a intenção era usar variáveis variáveis, talvez. Nesse caso, uma pesquisa de propriedade variável,
$this->{"myFunc$VAR"}();
por exemplo.Parênteses ausentes após construções de idioma
Digitação precipitada pode levar à abertura esquecido ou fechar parêntese para
if
efor
eforeach
declarações:Solução: adicione a abertura que falta
(
entre instrução e variável.O
{
colchete não abre o bloco de código, sem fechar aif
expressão com o)
parêntese de fechamento primeiro.Outro não espera condições
Solução: Remova as condições
else
ou useelseif
.Precisa de suportes para fechamento
Solução: adicione colchetes
$var
.Espaço em branco invisível
Conforme mencionado na resposta de referência em "Unicode disperso invisível" (como um espaço sem quebra ), você também poderá ver esse erro para códigos inocentes como:
É bastante prevalente no início dos arquivos e no código copiado e colado. Verifique com um hexeditor, se o seu código não parece conter visualmente um problema de sintaxe.
Veja também
fonte
Inesperado T_CONSTANT_ENCAPSED_STRING
Inesperado T_ENCAPSED_AND_WHITESPACE
Os nomes pesados
T_CONSTANT_ENCAPSED_STRING
e seT_ENCAPSED_AND_WHITESPACE
referem aos literais citados ."string"
Eles são usados em contextos diferentes, mas o problema de sintaxe é bastante semelhante. T_ENCAPSED… os avisos ocorrem no contexto de cadeia de caracteres entre aspas duplas, enquanto as cadeias de caracteres T_CONSTANT… geralmente se desviam em expressões ou instruções simples do PHP.
Interpolação variável incorreta
E surge com mais freqüência para interpolação incorreta de variáveis PHP:
A citação de chaves de matrizes é essencial no contexto do PHP. Mas em seqüências de caracteres duplas entre aspas (ou HEREDOCs) isso é um erro. O analisador reclama do único citado contido
'string'
, porque geralmente espera um identificador / chave literal lá.Mais precisamente, é válido usar sintaxe simples no estilo PHP2 entre aspas duplas para referências de matriz:
Matrizes aninhadas ou referências mais profundas a objetos, no entanto, requerem a sintaxe complexa da expressão em cadeia de caracteres :
Se não tiver certeza, é mais seguro usar isso. Muitas vezes, é considerado ainda mais legível. E IDEs melhores realmente usam cores de sintaxe distintas para isso.
Falta concatenação
Se uma string segue uma expressão, mas não possui uma concatenação ou outro operador, você verá o PHP reclamando da literal da string:
Embora seja óbvio para você e para mim, o PHP simplesmente não consegue adivinhar que a string deveria ser anexada lá.
Gabinetes de cotação de cadeia confusos
O mesmo erro de sintaxe ocorre ao confundir delimitadores de string . Uma sequência iniciada por aspas simples
'
ou duplas"
também termina com o mesmo.Esse exemplo começou com aspas duplas. Mas aspas duplas também foram destinadas aos atributos HTML. O operador de concatenação pretendido no entanto tornou-se interpretado como parte de uma segunda sequência entre aspas simples.
Este é um bom exemplo em que você não deve separar aspas duplas em primeiro lugar. Em vez disso, use escapes adequados
\"
para as aspas dos atributos HTML:Embora isso também possa levar à confusão de sintaxe, todos os melhores IDEs / editores ajudam novamente a colorir as aspas escapadas de maneira diferente.
Falta citação de abertura
Equivalentemente são esquecidos ao abrir
"
/'
citar uma receita para erros do analisador:Aqui, a
', '
string se tornaria literal após uma palavra de barra, quando obviamentelogin
deveria ser um parâmetro de string.Listas de matrizes
Se você perder uma
,
vírgula em um bloco de criação de matriz, o analisador verá duas seqüências consecutivas:Observe que a última linha sempre pode conter uma vírgula extra, mas negligenciar uma entre elas é imperdoável. Difícil de descobrir sem destacar a sintaxe.
Listas de parâmetros de função
O mesmo para chamadas de função :
Cordas em fuga
Uma variação comum são terminadores de cadeia simplesmente esquecidos:
Aqui, o PHP reclama de dois literais de sequência diretamente um após o outro. Mas a causa real é a sequência anterior não fechada, é claro.
Veja também
fonte
T_STRING inesperado
T_STRING
é um pouco impróprio. Não se refere a um citado"string"
. Isso significa que um identificador bruto foi encontrado. Isso pode variar debare
palavras aCONSTANT
nomes restantes ou de funções, seqüências de caracteres não citadas esquecidas ou qualquer texto sem formatação.Sequências citadas incorretamente
No entanto, esse erro de sintaxe é mais comum para valores de seqüência de caracteres citados incorretamente. Qualquer fuga
"
ou'
citação sem escape , formará uma expressão inválida:O destaque da sintaxe fará com que esses erros sejam super óbvios. É importante lembrar de usar barras invertidas para escapar de
\"
aspas duplas ou de\'
aspas simples - dependendo de qual foi usado como gabinete de string ."
aspas duplas literais .echo
/print
linhas em vez de escapar dentro e para fora. Melhor ainda, considere uma seção HEREDOC .Outro exemplo é o uso da entrada PHP dentro do código HTML gerado com o PHP:
Isso acontece se
$text
for grande com muitas linhas e o desenvolvedor não vê todo o valor da variável PHP e se concentra no pedaço de código que esquece sua origem. O exemplo está aquiVeja também Qual é a diferença entre strings de aspas simples e aspas duplas no PHP? .
Strings não fechadas
Se você perder um fechamento
"
, um erro de sintaxe geralmente ocorre mais tarde. Uma sequência não terminada geralmente consome um pouco de código até o próximo valor da sequência pretendida:Não são apenas literais
T_STRING
que o analisador pode protestar então. Outra variação frequente é umUnexpected '>'
HTML literal sem aspas.Citações de strings não programadas
Se você copiar e colar código de um blog ou site, às vezes você acaba com um código inválido. Citações tipográficas não são o que o PHP espera:
Citações tipográficas / inteligentes são símbolos Unicode. O PHP os trata como parte do texto alfanumérico adjacente. Por exemplo,
”these
é interpretado como um identificador constante. Mas qualquer literal de texto a seguir é 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, qualquer declaração ou construção de idioma a seguir será vista como identificador bruto:
O PHP simplesmente não pode saber se você pretendia executar duas funções após outra, ou se pretendia multiplicar seus resultados, adicioná-los, compará-los ou executar apenas um
||
ou outro.Tags e
<?xml
cabeçalhos abertos curtos em scripts PHPIsso é bastante incomum. Mas se short_open_tags estiver ativado, você não poderá iniciar seus scripts PHP com uma declaração XML :
O PHP verá
<?
e o recuperará por si mesmo. Não vai entender para que o vira-lataxml
foi criado. Será interpretado como constante. Mas oversion
será visto como outro literal / constante. E como o analisador não consegue entender dois valores literais / valores subsequentes sem um operador de expressão no meio, isso será uma falha no analisador.Caracteres Unicode invisíveis
A causa mais hedionda para erros de sintaxe são os símbolos Unicode, como o espaço sem quebra . O PHP permite caracteres Unicode como nomes de identificador. Se você receber uma reclamação do analisador T_STRING por código totalmente suspeito, como:
Você precisa interromper outro editor de texto. Ou um hexeditor mesmo. O que parece espaços simples e novas linhas aqui, pode conter constantes invisíveis. Às vezes, os IDEs baseados em Java são alheios a uma BOM UTF-8, com espaços de largura zero, separadores de parágrafos, etc. Tente reeditar tudo, remover espaços em branco e adicionar espaços normais novamente.
Você pode reduzi-lo adicionando
;
separadores de instrução redundantes a cada início de linha:O
;
ponto-e-vírgula extra aqui converterá o caractere invisível precedente em uma referência constante indefinida (expressão como instrução). O que, por sua vez, faz com que o PHP produza um aviso útil.O sinal `$` ausente na frente dos nomes das variáveis
As variáveis no PHP são representadas por um cifrão seguido pelo nome da variável.
O sinal de cifrão (
$
) é um símbolo que marca o identificador como o nome de uma variável. Sem esse sigilo, o identificador poderia ser uma palavra - chave do idioma ou uma constante .Este é um erro comum quando o código PHP foi "traduzido" a partir do código escrito em outro idioma (C, Java, JavaScript etc.). Nesses casos, uma declaração do tipo de variável (quando o código original foi escrito em um idioma que usa variáveis digitadas) também pode ser furtiva e produzir esse erro.
Aspas escapadas
Se você usar
\
uma string, ela terá um significado especial. Isso é chamado de " Personagem de escape " e normalmente diz ao analisador para interpretar o próximo caractere literalmente.Exemplo:
echo 'Jim said \'Hello\'';
imprimiráJim said 'hello'
Se você escapar da citação final de uma sequência, a citação final será tomada literalmente e não como pretendido, ou seja, como uma citação imprimível como parte da sequência e não a fechará. Isso será exibido como um erro de análise normalmente depois que você abre a próxima sequência ou no final do script.
Erro muito comum ao especificar caminhos no Windows:
"C:\xampp\htdocs\"
está errado. Você precisa"C:\\xampp\\htdocs\\"
.fonte
Inesperado
(
Parênteses de abertura geralmente seguem construções de linguagem como
if
/foreach
/for
/array
/ /list
ou iniciam uma expressão aritmética. Eles estão sintaticamente incorretos após"strings"
, um anterior()
, um solitário$
e em alguns contextos de declaração típicos.Parâmetros de declaração de função
Uma ocorrência mais rara desse erro está tentando usar expressões como parâmetros de função padrão . Isso não é suportado, mesmo no PHP7:
Os parâmetros em uma declaração de função podem ser apenas valores literais ou expressões constantes. Ao contrário das chamadas de função, onde você pode usar livremente
whatever(1+something()*2)
, etc.Padrões de propriedade de classe
O mesmo vale para declarações de membros da classe , onde apenas valores literais / constantes são permitidos, não expressões:
Coloque essas coisas no construtor. Veja também Por que os atributos PHP não permitem funções?
Note novamente que o PHP 7 só permite
var $xy = 1 + 2 +3;
expressões constantes lá.Sintaxe do JavaScript em PHP
O uso da sintaxe JavaScript ou jQuery não funcionará no PHP por razões óbvias:
Quando isso acontece, geralmente indica uma sequência anterior não terminada; e
<script>
seções literais vazando no contexto do código PHP.isset (()), vazio, chave, próximo, atual
Ambos
isset()
eempty()
são de língua built-ins, e não funções. Eles precisam acessar uma variável diretamente . Se você inadvertidamente adicionar muitos parênteses, criaria uma expressão no entanto:O mesmo se aplica a qualquer construção de idioma que exija acesso implícito ao nome da variável. Esses integrados fazem parte da gramática do idioma, portanto, não permitem parênteses extras decorativos.
As funções no nível do usuário que exigem uma referência variável, mas obtêm um resultado de expressão, levam a erros de tempo de execução.
Inesperado
)
Parâmetro de função ausente
Você não pode ter vírgulas perdidas por último em uma chamada de função . O PHP espera um valor lá e, portanto, reclama de um
)
parêntese de fechamento antecipado .Uma vírgula à direita é permitida apenas em
array()
oulist()
construções.Expressões inacabadas
Se você esquecer algo em uma expressão aritmética, o analisador desiste. Porque como deve interpretar isso:
E se você se esquecesse do resultado final
)
, receberia uma reclamação sobre o ponto e vírgula inesperado.Foreach como
constant
Para prefixos de variáveis esquecidos
$
nas instruções de controle, você verá:O PHP aqui às vezes diz que você esperava um
::
. Como uma classe :: $ variable poderia ter satisfeito a expressão esperada da variável $ ..Inesperado
{
Chaves
{
entre dentes e}
coloque blocos de código. E erros de sintaxe sobre eles geralmente indicam algum aninhamento incorreto.Subexpressões sem correspondência em um
if
Geralmente desequilibrado
(
e)
é a causa se o analisador reclamar que a abertura cresça{
muito cedo. Um exemplo simples:Conte seus parênteses ou use um IDE que ajude com isso. Também não escreva código sem espaços. Legibilidade conta.
{e} no contexto da expressão
Você não pode usar chaves em expressões. Se você confundir parênteses e parênteses, isso não obedece à gramática do idioma:
Existem algumas exceções para a construção do identificador, como a variável de escopo local
${references}
.Variáveis variáveis ou expressões var encaracoladas
Isso é bem raro. Mas você também pode obter
{
e}
analisar reclamações de expressões variáveis complexas:Embora exista uma probabilidade maior de um inesperado
}
em tais contextos.Inesperado
}
Ao receber um
}
erro " inesperado ", você fecha um bloco de código muito cedo.Última declaração em um bloco de código
Isso pode acontecer para qualquer expressão não terminada.
E se a última linha em um bloco de função / código não tiver um
;
ponto e vírgula à direita :Aqui, o analisador não pode dizer se você talvez ainda queira adicionar
+ 25;
ao resultado da função ou algo mais.Aninhamento de bloco inválido / Esquecido
{
Às vezes, você vê esse erro do analisador quando um bloco de código foi
}
fechado muito cedo ou se esqueceu de uma abertura{
:No trecho acima
if
, não havia uma{
chave de abertura . Assim, o fechamento}
abaixo se tornou redundante. E, portanto, o próximo fechamento}
, destinado à função, não era associável à{
chave de abertura original .Esses erros são ainda mais difíceis de encontrar sem o recuo do código adequado. Use um IDE e correspondência de colchetes.
Inesperado
{
, esperando(
Construções de linguagem que requerem um cabeçalho de condição / declaração e um bloco de código acionam esse erro.
Listas de parâmetros
Por exemplo , funções mal declaradas sem lista de parâmetros não são permitidas:
Condições da instrução de controle
E você também não pode ter um
if
sem condição .O que não faz sentido, obviamente. A mesma coisa para os suspeitos do costume,
for
/foreach
,while
/do
, etc.fonte
$ End inesperado
Quando o PHP fala sobre um "inesperado
$end
", significa que seu código terminou prematuramente. (A mensagem é um pouco enganadora quando interpretada literalmente. Não se trata de uma variável chamada "$ end", como algumas vezes assumida pelos recém-chegados. Refere-se ao "fim do arquivo" EOF.)É quase sempre sobre uma falta
}
chaveta para fechar blocos de código anteriores.Novamente, use o recuo adequado para evitar esses problemas.
Use um IDE com correspondência de colchetes para descobrir onde
}
está errado. Existem atalhos de teclado na maioria dos IDEs e editores de texto:A maioria dos IDEs também destaca chaves, parênteses e parênteses. O que facilita bastante a inspeção de sua correlação:
Expressões não terminadas
E
Unexpected $end
erro de sintaxe / analisador também pode ocorrer para expressões ou instruções não terminadas:$var = func(1,
?>
EOFPortanto, observe primeiro o final dos scripts. Um trailing
;
geralmente é redundante para a última instrução em qualquer script PHP. Mas você deveria ter um. Precisamente porque reduz esses problemas de sintaxe.Marcadores HEREDOC recuados
Outra ocorrência comum aparece com as seqüências HEREDOC ou NOWDOC . O marcador final é ignorado com espaços à esquerda, tabulações, etc .:
Portanto, o analisador supõe que a sequência HEREDOC continue até o final do arquivo (daí "$ end inesperado"). Praticamente todos os IDEs e editores de realce de sintaxe tornarão isso óbvio ou alertar sobre isso.
Aspas escapadas
Se você usar
\
uma string, ela terá um significado especial. Isso é chamado de " Personagem de escape " e normalmente diz ao analisador para interpretar o próximo caractere literalmente.Exemplo:
echo 'Jim said \'Hello\'';
imprimiráJim said 'hello'
Se você escapar da citação final de uma sequência, a citação final será tomada literalmente e não como pretendido, ou seja, como uma citação imprimível como parte da sequência e não a fechará. Isso será exibido como um erro de análise normalmente depois que você abre a próxima sequência ou no final do script.
Erro muito comum ao especificar caminhos no Windows:
"C:\xampp\htdocs\"
está errado. Você precisa"C:\\xampp\\htdocs\\"
.Sintaxe alternativa
Um pouco mais raro, você pode ver esse erro de sintaxe ao usar a sintaxe alternativa para blocos de instrução / código em modelos. Usando
if:
eelse:
e falta,endif;
por exemplo.Veja também:
fonte
Inesperado T_IF
Inesperado T_ELSEIF
Inesperado T_ELSE
Inesperado T_ENDIF
Blocos de controle de condicionais
if
,elseif
eelse
seguem uma estrutura simples. Quando você encontra um erro de sintaxe, é provável que seja apenas aninhamento de bloco inválido → com{
chaves em falta}
- ou um número excessivo.Falta
{
ou}
devido a recuo incorretoChaves de código incompatíveis são comuns a códigos menos bem formatados, como:
Se o seu código estiver assim, inicie novamente! Caso contrário, não poderá ser corrigido para você ou qualquer outra pessoa. Não faz sentido mostrar isso na internet para pedir ajuda.
Você só poderá corrigi-lo se puder seguir visualmente a estrutura e a relação aninhada das condicionais if / else e seus
{
blocos de código}
. Use seu IDE para ver se todos estão emparelhados.Qualquer duplo
}
}
não apenas fechará uma ramificação, mas uma estrutura de condição anterior. Portanto, fique com um estilo de codificação; não misture e combine em árvores aninhadas if / else.Além da consistência aqui, é útil evitar também condições demoradas. Use variáveis ou funções temporárias para evitar
if
expressões ilegíveis .IF
não pode ser usado em expressõesUm erro de iniciante surpreendentemente frequente está tentando usar uma
if
declaração em uma expressão, como uma declaração impressa:O que é inválido, é claro.
Você pode usar um condicional ternário , mas cuidado com os impactos de legibilidade.
Caso contrário quebrar tais construções de saída para cima: uso múltiplo
if
s eecho
s .Melhor ainda, use variáveis temporárias e coloque suas condicionais antes:
Definir funções ou métodos para esses casos também costuma fazer sentido.
Blocos de controle não retornam "resultados"
Agora isso é menos comum, mas alguns codificadores tentam tratar
if
como se isso pudesse retornar um resultado :O que é estruturalmente idêntico ao uso
if
dentro de uma concatenação / expressão de string.Você precisará usar uma atribuição no bloco de código :
Como alternativa, recorra a uma
?:
comparação ternária.Se em Se
Você não pode aninhar um
if
dentro de uma condição:O que é obviamente redundante, porque o
and
(ouor
) já permite comparações de encadeamento.;
Ponto e vírgula esquecidoMais uma vez: Cada bloco de controle precisa ser uma declaração. Se o trecho de código anterior não terminar com ponto e vírgula, será um erro de sintaxe garantido:
Btw, a última linha em um
{…}
bloco de código também precisa de um ponto e vírgula.Ponto e vírgula muito cedo
Agora provavelmente está errado culpar um estilo de codificação específico, pois essa armadilha é muito fácil de ignorar:
O que acontece com mais frequência do que você imagina.
if ()
expressão,;
ela executa uma declaração nula. O;
torna-se um vazio{}
por si só!{…}
bloco, portanto, é desanexado doif
e sempre executado.else
não havia mais uma relação com umaif
construção aberta , e é por isso que isso levaria a um erro de sintaxe inesperado T_ELSE.O que também explica uma variação igualmente sutil desse erro de sintaxe:
Onde o
;
bloco de código após{…}
finaliza toda aif
construção, cortando oelse
ramo sintaticamente.Não usando blocos de código
É sintaticamente permitido omitir chaves
{
...}
para blocos de código emif
/elseif
/else
branches. Infelizmente, esse é um estilo de sintaxe muito comum para codificadores não-impressos. (Sob a falsa suposição, era mais rápido digitar ou ler).No entanto, é altamente provável que ocorra a sintaxe. Mais cedo ou mais tarde, instruções adicionais encontrarão seu caminho para os ramos if / else:
Mas para realmente usar blocos de código, você precisa escrevê- los
{
...}
como tal!Elseif / Elseif na ordem errada
Uma coisa a lembrar é a ordem condicional , é claro.
Você pode ter quantos
elseif
s quiser, maselse
tem que ir por último . É assim mesmo.Declarações de classe
Como mencionado acima , você não pode ter instruções de controle em uma declaração de classe:
Você esqueceu uma definição de função ou fechou uma
}
muito cedo nesses casos.T_ELSEIF / T_ELSE inesperado
Ao misturar PHP e HTML, o fechamento
}
de umif/elseif
deve estar no mesmo bloco PHP<?php ?>
que o próximoelseif/else
. Isso gerará um erro, pois o fechamento}
dasif
necessidades de fazer parte doelseif
:A forma correta
<?php } elseif
:Isso é mais ou menos uma variação de indentação incorreta - presumivelmente com base em intenções de codificação incorretas.
Você não pode mascarar outras instruções entre
if
eelseif
/else
tokens estruturais:Isso só pode ocorrer em
{…}
blocos de código, não entre os tokens da estrutura de controle.if
eelse
branches.Você também não pode separar um if / else entre diferentes estruturas de controle:
Não há relação sintática entre o
if
eelse
. Oforeach
escopo lexical termina em}
, então não há sentido para aif
estrutura continuar.T_ENDIF
Se um T_ENDIF inesperado for reclamado, você estará usando o estilo de sintaxe alternativo
if:
⋯elseif:
⋯else:
⋯endif;
. O que você realmente deve pensar duas vezes.Uma armadilha comum é confundir o cólon assustadoramente semelhante
:
por um;
ponto e vírgula . (Coberto em "Ponto e vírgula muito cedo")Como o recuo é mais difícil de rastrear nos arquivos de modelo, mais ao usar a sintaxe alternativa - é plausível que você
endif;
não corresponda a nenhumif:
.O uso
} endif;
é um terminador dobradoif
.Enquanto um "fim inesperado de $" geralmente é o preço de uma
}
chave de fechamento esquecida .Tarefa versus comparação
Portanto, este não é um erro de sintaxe, mas vale a pena mencionar neste contexto:
Isso não é um
==
/===
comparação, mas uma=
atribuição . Isso é bastante sutil e levará facilmente alguns usuários a editar impotentes blocos de condições inteiros. Cuidado com as atribuições não intencionais primeiro - sempre que ocorrer uma falha / mau comportamento lógico.fonte
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_S_ALL_
inesperado
<
Inesperado Inesperado
>
Os operadores de comparação, tais como
==
,>=
,===
,!=
,<>
,!==
e<=
ou<
e>
principalmente deve ser usado apenas em expressões, tais comoif
expressões. Se o analisador reclamar sobre eles, isso geralmente significa um pareamento incorreto ou(
)
parênteses incompatíveis ao seu redor.Agrupamento de Parens
Em particular para
if
declarações com múltiplas comparações, você deve ter o cuidado de contar corretamente os parênteses de abertura e fechamento :Aqui a
if
condição aqui já foi encerrada pelo)
Uma vez que suas comparações se tornam suficientemente complexas, geralmente ajuda a dividi-las em múltiplas e aninhadas
if
construções .isset () amassado com comparação
Um novato comum é pitfal, tentando combinar
isset()
ouempty()
com comparações:Ou até:
Isso não faz sentido para PHP, porque
isset
eempty
são construções de linguagem que só aceitam nomes de variáveis. Também não faz sentido comparar o resultado, porque a saída é apenas / já é booleana.Confundindo
>=
maior ou igual ao=>
operador de matrizOs dois operadores parecem um pouco parecidos e, por vezes, se confundem:
Você só precisa lembrar que esse operador de comparação é chamado " maior que ou igual " para acertar.
Veja também: Estrutura da instrução If em PHP
Nada para comparar
Você também não pode combinar duas comparações se elas pertencerem ao mesmo nome de variável:
O PHP não pode deduzir que você pretendia comparar a variável inicial novamente. As expressões geralmente são emparelhadas de acordo com a precedência do operador , portanto, no momento em que o
<
é visto, resta apenas um resultado booleano da variável original.Veja também: inesperado T_IS_SMALLER_OR_EQUAL
Cadeias de comparação
Você não pode comparar uma variável com uma linha de operadores:
Isso deve ser dividido em duas comparações, cada uma contra
$x
.Este é realmente mais um caso de expressões na lista negra (devido à associatividade equivalente do operador). É sintaticamente válido em algumas linguagens de estilo C, mas o PHP também não a interpretaria como uma cadeia de comparação esperada.
Inesperado
>
Inesperado
<
Os operadores maiores
>
ou menores que<
não têm umT_XXX
nome de tokenizer personalizado . E enquanto eles podem ser extraviados como todos os outros, você vê com mais freqüência o analisador reclamar sobre eles por seqüências de caracteres citadas incorretamente e HTML esmagado:Isso equivale a uma string
"<a href='z"
sendo comparada>
a uma constante literalHello
e depois a outra<
comparação. Ou é pelo menos o que o PHP vê. A causa real e o erro de sintaxe foi o"
encerramento prematuro da string .Também não é possível aninhar tags de início do PHP:
Veja também:
fonte
Inesperado T_IF
Inesperado T_FOREACH
Inesperado T_FOR
Inesperado T_WHILE
Inesperado T_DO
Inesperado T_ECHO
Controlo construções tais como
if
,foreach
,for
,while
,list
,global
,return
,do
,print
,echo
pode ser usado apenas como declarações. Eles geralmente residem em uma linha por si mesmos.Ponto e vírgula; onde você está?
Muito universalmente, você perdeu um ponto e vírgula na linha anterior se o analisador reclamar de uma declaração de controle:
Solução: observe a linha anterior; adicione ponto e vírgula.
Declarações de classe
Outro local onde isso ocorre está nas declarações de classe . Na seção de classe, você pode listar apenas as inicializações de propriedades e as seções de método. Nenhum código pode residir lá.
Tais erros de sintaxe geralmente se materializam para aninhados
{
e incorretamente}
. Em particular, quando os blocos de código de função foram fechados muito cedo.Instruções no contexto da expressão
A maioria das construções de linguagem pode ser usada apenas como instruções . Eles não devem ser colocados dentro de outras expressões:
Da mesma forma, você não pode usar um
if
em strings, expressões matemáticas ou em outro lugar:Para incorporar
if
condições semelhantes a uma expressão especificamente, geralmente você deseja usar uma?:
avaliação ternária .O mesmo se aplica a
for
,while
,global
,echo
e em menor extensãolist
.Considerando que
print()
é uma linguagem interna que pode ser usada no contexto da expressão. (Mas raramente faz sentido.)Palavras-chave reservadas como identificadores
Você também não pode usar
do
ouif
outras construções de linguagem para funções definidas pelo usuário ou nomes de classe. (Talvez no PHP 7. Mas mesmo assim não seria aconselhável.)fonte
Inesperado '?'
Se você estiver tentando usar o operador coalescente nulo
??
em uma versão do PHP anterior ao PHP 7, receberá este erro.Inesperado '?', Esperando variável
Um erro semelhante pode ocorrer para tipos anuláveis, como em:
O que novamente indica que uma versão PHP desatualizada está sendo usada (a versão CLI
php -v
ou o servidor da Web vinculadophpinfo();
).fonte
T_LNUMBER inesperado
O token
T_LNUMBER
refere-se a um número "longo".Nomes de variáveis inválidos
No PHP, e na maioria das outras linguagens de programação, as variáveis não podem começar com um número. O primeiro caractere deve ser alfabético ou um sublinhado.
Muitas vezes surge com o uso de
preg_replace
-placeholders"$1"
no contexto do PHP:Onde o retorno de chamada deveria ter sido citado. (Agora, o
/e
sinalizador regex foi descontinuado. Mas, às vezes, ainda é mal utilizado naspreg_replace_callback
funções.)A mesma restrição de identificador se aplica às propriedades do objeto , btw.
Enquanto o tokenizer / analisador não permite um literal
$1
como nome da variável, pode-se usar${1}
or${"1"}
. Qual é uma solução sintática para identificadores não padrão. (É melhor pensar nisso como uma pesquisa de escopo local. Mas geralmente: prefira matrizes simples para esses casos!)Divertidamente, mas muito pouco recomendado, o analisador de PHPs permite identificadores Unicode; tal que
$➊
seria válido. (Diferente de um literal1
).Entrada de matriz dispersa
Um longo inesperado também pode ocorrer para declarações de matriz - quando faltam
,
vírgulas:Ou também chamadas e declarações de função e outras construções:
func(1, 2 3);
function xy($z 2);
for ($i=2 3<$z)
Geralmente, há um
;
ou,
falta para separar listas ou expressões.HTML incorreto
E, novamente, cadeias de caracteres erradas são uma fonte frequente de números dispersos:
Esses casos devem ser tratados mais ou menos como erros inesperados de T_STRING .
Outros identificadores
Nem funções, classes nem espaços para nome podem ser nomeados começando com um número:
Praticamente o mesmo que para nomes de variáveis.
fonte
Inesperado '='
Isso pode ser causado por caracteres inválidos em um nome de variável. Os nomes das variáveis devem seguir estas regras:
fonte
'Continuar' inesperado (T_CONTINUE)
continue
é uma declaração (como para ou se) e deve parecer independente. Não pode ser usado como parte de uma expressão. Em parte porque continue não retorna um valor, mas em uma expressão todas as subexpressões devem resultar em algum valor para que a expressão geral resulte em um valor. Essa é a diferença entre uma declaração e uma expressão.Que significa
continue
não pode ser usado em uma declaração ternária ou em qualquer declaração que exija um valor de retorno.'Pausa' inesperada (T_BREAK)
O mesmo vale, é
break;
claro. Também não é utilizável no contexto da expressão, mas uma declaração estrita (no mesmo nívelforeach
ouif
bloco).'Retorno' inesperado (T_RETURN)
Agora isso pode ser mais surpreendente
return
, mas isso também é apenas uma declaração em nível de bloco . Ele retorna um valor (ou NULL) para o escopo / função mais alto, mas não é avaliado como expressão em si. → Ou seja: não faz sentido fazerreturn(return(false);;
fonte
Inesperado '.'
Isso pode ocorrer se você estiver tentando usar o operador splat (
...
) em uma versão não suportada do PHP....
foi disponibilizado pela primeira vez no PHP 5.6 para capturar um número variável de argumentos para uma função:No PHP 7.4, você poderia usá-lo para expressões Array .
fonte
Tempo de espera inesperado (T_ENDWHILE)
A sintaxe está usando dois pontos - se não houver dois pontos, o erro acima ocorrerá.
A alternativa a essa sintaxe é usar colchetes:
http://php.net/manual/en/control-structures.ilst.php
fonte
Uma mensagem de erro iniciada
Parse error: syntax error, unexpected ':'
pode ser causada por escrever incorretamente uma referência estática de classeClass::$Variable
comoClass:$Variable
.fonte