Erros de análise / sintaxe do PHP; e como resolvê-los

651

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:

Referências estreitamente relacionadas:

E:

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á realmenterelacionado, mas um - 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.

mario
fonte
1
Esses dados não são suficientes para ser uma resposta, mas é possível escrever um analisador com parsekit_compile_string e colocar respostas mais amigáveis. Se integrado ao seu IDE, isso pode ser bastante informativo.
Owen Beresford
4
Você coloca uma quantidade impressionante de trabalho nisso. Respeito por isso. Provavelmente é muito bom que os professores aprendam a apontar rapidamente erros ou para quem cria IDEs ou implementa correções rápidas. No entanto, os IDEs já efetivamente farão a maior parte desse trabalho para você, como sugere o @Panique. Além disso, em muitos casos, o início do zero é uma boa opção.
allprog
1
@ Fred-ii- Eu acho que a maioria das causas é semelhante ao T_IF / T_FOREACH / ...bloco. Embora eu desejasse compilar um resumo mais personalizado para as perguntas IF / ELSE / ELSEIF.
Mario
1
@ mario Não sei como expressar isso, mas essas perguntas e respostas devem ser um pouco reescritas e mais estruturadas? (comentário temporário)
Rizier123
2
Você sabe, eu gostaria de ter essa lista quando estava aprendendo PHP anos atrás. Muito útil, especialmente para iniciantes.
Chipster

Respostas:

291

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.

Resumo de sintaxe de definição de funçã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.

    Esperado: ponto e vírgula

  • 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 é:

Erro de análise: erro de sintaxe, T_STRING inesperado , esperando ' ;' em file.php na linha 217

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_STRINGexplica 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 ifinstruções complexas em ifcondiçõ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:

      1. O código que você pode identificar facilmente como correto,
      2. As partes que você não tem certeza,
      3. E as linhas que o analisador reclama.

      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. Prefira ifinstruçõ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.

    • Adote um sistema de controle de versão do código-fonte. Você sempre pode ver uma diffdas 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.phpcomo 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.inigeral, ou via .htaccessmod_php, ou mesmo .user.inicom 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:

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

Em seguida, chame o código com falha acessando esse script do wrapper.

Também ajuda a habilitar o PHP error_loge procurar no servidor da weberror.log quando um script trava com respostas HTTP 500.

mario
fonte
error_reporting(E_ALL | E_STRICT);para versões anteriores do PHP
Geo
2
Alguns IDEs (como o NetBeans) não apenas oferecem suporte ao destaque de sintaxe, mas também à formatação de código. Se você adquirir o hábito de formatar seu código corretamente e solicitar ao IDE que reformate de vez em quando, poderá ser difícil identificar problemas como chaves sem correspondência.
Josep Valls
115

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

  1. NetBeans [grátis]
  2. PHPStorm [$ 199 USD]
  3. Eclipse com PHP Plugin [grátis]
  4. Sublime [$ 80 USD] (principalmente um editor de texto, mas expansível com plugins, como o PHP Syntax Parser )
Sliq
fonte
2
É obviamente. No entanto, relendo IDEs aqui, você pode explicar um pouco onde eles diferem em termos de utilidade de sintaxe? Sublime é principalmente um editor, não IDE; mas depois mais bonita e ágil; realça principalmente a realce da sintaxe, mas também é verdadeira na correspondência entre colchetes. Ele descobre facilmente os erros T_CONSTANT_AND_ENCAPSED instantaneamente, por exemplo, ao contrário do PHPStorm; que, no entanto, cria linhas mais irregulares para erros em linha. As dicas de sintaxe do NetBeans costumavam ser mais enigmáticas do que os PHPs (até mesmo revendo as construções permitidas). Você pode compartilhar sua experiência em prós / contras; é o seu Eclipse / PDT favorito ou ..?
mario
@ mario Eu acho que você está realmente interessado no assunto, então eu realmente não quero dizer nada de errado aqui, mas todo o código que eu (e meus companheiros de equipe, amigos que codificam, parceiros freelancers) já escrevi em um IDE nunca foi executado com um erro de sintaxe. Então, acho que pelo menos a verificação de sintaxe do Netbeans / PHPStorm é extremamente poderosa. Mas talvez eu tenha interpretado mal sua pergunta. Dá-me algumas horas ...;)
Sliq 12/08
Sua resposta já está no local. Caberia 99% de nossas perguntas. No entanto, para o contexto aqui, eu gostaria de ter uma consideração sobre o qual o IDE fornece as dicas de ferramentas mais amigáveis ​​para iniciantes . Provavelmente é pequeno para nós, cores e linhas onduladas sendo suficientes se você for versado o suficiente. Mas presumo que as diferenças possam ser mais significativas para iniciantes.
mario
Às vezes, um IDE não é uma opção viável. Por exemplo, fazendo edições rápidas em um tema ou plugin do WordPress. Sim, eu poderia copiar todo o código em um IDE, mas tenho que abri-lo, colar tudo lá, definir cabeçalhos e todo esse tempo desperdiçando lixo, quando espero apenas uma edição rápida. Agora, se você estiver desenvolvendo novos recursos ou começando do zero, faça-o em um IDE. Você não vai se arrepender de gastar esse tempo extra no início para configurá-lo.
1934286 06/0317
Eu vejo o IDE como um trailer, não apenas como uma caixa de ferramentas. Pode não ser CORRIGIDO, mas pode ajudá-lo a encontrar e evitar erros de sintaxe. Muitas respostas aqui parecem dizer que, se você mantiver o código limpo, terá menos chance de cometer um erro e será mais fácil identificá-lo. Bem, com a indentação automática, dicas de código, ocorrência variável, colchetes de fechamento automático e formatação automática, economizo muitos erros de digitação por dia e é a principal vantagem do uso de um. Isso não está contando tudo além do escopo desta questão (depurador, conector de banco de dados, diagrama uml etc.). O IDE economizará tempo e evitará mais do que apenas erros de sintaxe.
Louis Loudog Trottier 27/03
58

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

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

A desreferencia de resultado da função de matriz também não está disponível para versões mais antigas do PHP:

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

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

    protected $var["x"] = "Nope";
                  
  • Confundir [com a abertura de chaves {ou parênteses (é uma supervisão comum.

    foreach [$a as $b)
            

    Ou até:

    function foobar[$a, $b, $c] {
                   
  • Ou tentando desreferenciar constantes (antes do PHP 5.6) como matrizes:

    $var = const[123];
           

    Pelo menos o PHP interpreta isso constcomo 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 globalpalavra-chave em um membro de uma matriz associativa. Esta não é uma sintaxe válida:

    global $var['key'];


Parêntese quadrado inesperado de ] fechamento

Isso é 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:

    function foobar($a, $b, $c] {
                              
  • Ou tentando finalizar uma matriz onde não há uma:

    $var = 2];

    O que geralmente ocorre em declarações de matriz com várias linhas e aninhadas .

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

    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.

mario
fonte
O link ' downgrade de conversores de sintaxe do PHP 5.4' github.com/IonutBajescu/short-arrays-to-long-arrays acima está quebrado.
Danimal Reks
46

Inesperado T_VARIABLE

Um "inesperado T_VARIABLE" significa que há um $variablenome literal , que não se encaixa na estrutura atual de expressão / instrução.

operador propositadamente abstrato / inexato + diagrama de variáveis ​​$

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

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. Concatenação de cadeias

    Um acidente frequente são as concatenações de strings com o .operador esquecido :

                                   
    print "Here comes the value: "  $value;

    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.

    A interpolação de strings é um recurso principal da linguagem de script . Não há vergonha em utilizá-lo. Ignore qualquer aviso de micro otimização sobre a .concatenação de variáveis ser mais rápida . Não é.

  3. Operadores de expressão ausentes

    É claro que o mesmo problema pode surgir em outras expressões, por exemplo, operações aritméticas:

               
    print 4 + 7 $var;

    O PHP não consegue adivinhar aqui se a variável deveria ter sido adicionada, subtraída ou comparada etc.

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

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

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

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

    Equivalentemente você vê isso com listou globaldeclarações, ou quando falta um ;ponto e vírgula em um forloop.

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

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

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

  6. Variáveis ​​após identificadores

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

                 
    $this->myFunc$VAR();

    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.

    Lembre-se de que o uso de variáveis ​​variáveis ​​deve ser a exceção. Os recém-chegados geralmente tentam usá-los de maneira muito casual, mesmo quando os arrays são mais simples e apropriados.

  7. Parênteses ausentes após construções de idioma

    Digitação precipitada pode levar à abertura esquecido ou fechar parêntese para ife fore foreachdeclarações:

           
    foreach $array as $key) {

    Solução: adicione a abertura que falta (entre instrução e variável.

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

    O {colchete não abre o bloco de código, sem fechar a ifexpressão com o )parêntese de fechamento primeiro.

  8. Outro não espera condições

         
    else ($var >= 0)

    Solução: Remova as condições elseou use elseif.

  9. Precisa de suportes para fechamento

         
    function() uses $var {}

    Solução: adicione colchetes $var.

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

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

    É 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

mario
fonte
32

Inesperado T_CONSTANT_ENCAPSED_STRING
Inesperado T_ENCAPSED_AND_WHITESPACE

Os nomes pesados T_CONSTANT_ENCAPSED_STRINGe se T_ENCAPSED_AND_WHITESPACEreferem 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.

  1. Interpolação variável incorreta

    E surge com mais freqüência para interpolação incorreta de variáveis ​​PHP:

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

    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:

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

    Matrizes aninhadas ou referências mais profundas a objetos, no entanto, requerem a sintaxe complexa da expressão em cadeia de caracteres :

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

    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.

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

                           
    print "Hello " . WORLD  " !";

    Embora seja óbvio para você e para mim, o PHP simplesmente não consegue adivinhar que a string deveria ser anexada lá.

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

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

    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.

    Dica : Defina seu editor / IDE para usar uma coloração ligeiramente distinta para seqüências de caracteres simples e duplas. (Ele também ajuda na lógica do aplicativo a preferir, por exemplo, cadeias de caracteres duplas entre aspas para saída de texto e cadeias de caracteres simples entre aspas apenas para valores do tipo constante.)

    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:

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

    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.

  4. Falta citação de abertura

    Equivalentemente são esquecidos ao abrir "/ 'citar uma receita para erros do analisador:

                   
     make_url(login', 'open');

    Aqui, a ', 'string se tornaria literal após uma palavra de barra, quando obviamente logindeveria ser um parâmetro de string.

  5. Listas de matrizes

    Se você perder uma ,vírgula em um bloco de criação de matriz, o analisador verá duas seqüências consecutivas:

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

    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.

  6. Listas de parâmetros de função

    O mesmo para chamadas de função :

                             
    myfunc(123, "text", "and"  "more")
  7. Cordas em fuga

    Uma variação comum são terminadores de cadeia simplesmente esquecidos:

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

    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

mario
fonte
27

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 de barepalavras a CONSTANTnomes restantes ou de funções, seqüências de caracteres não citadas esquecidas ou qualquer texto sem formatação.

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

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

    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 .

    • Por conveniência, você deve preferir aspas simples externas ao gerar HTML simples com aspas duplas.
    • Use cadeias de caracteres entre aspas duplas, se desejar interpolar variáveis, mas cuidado com a fuga de "aspas duplas literais .
    • Para saída mais longa, preferem múltiplas echo/ printlinhas 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:

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

    Isso acontece se $textfor 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á aqui

    Veja também Qual é a diferença entre strings de aspas simples e aspas duplas no PHP? .

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

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

    Não são apenas literais T_STRINGque o analisador pode protestar então. Outra variação frequente é um Unexpected '>'HTML literal sem aspas.

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

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

    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.

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

           
    func1()
    function2();

    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.

  5. Tags e <?xmlcabeçalhos abertos curtos em scripts PHP

    Isso é bastante incomum. Mas se short_open_tags estiver ativado, você não poderá iniciar seus scripts PHP com uma declaração XML :

          
    <?xml version="1.0"?>

    O PHP verá <?e o recuperará por si mesmo. Não vai entender para que o vira-lata xmlfoi criado. Será interpretado como constante. Mas o versionserá 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.

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

    <?php
        print 123;

    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:

    <?php
        ;print 123;

    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.

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

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

mario
fonte
18

Inesperado (

Parênteses de abertura geralmente seguem construções de linguagem como if/ foreach/ for/ array/ / listou 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.

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

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

    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.

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

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

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

  3. Sintaxe do JavaScript em PHP

    O uso da sintaxe JavaScript ou jQuery não funcionará no PHP por razões óbvias:

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

    Quando isso acontece, geralmente indica uma sequência anterior não terminada; e <script>seções literais vazando no contexto do código PHP.

  4. isset (()), vazio, chave, próximo, atual

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

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

    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 )

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

                  
    callfunc(1, 2, );

    Uma vírgula à direita é permitida apenas em array()ou list()construções.

  2. Expressões inacabadas

    Se você esquecer algo em uma expressão aritmética, o analisador desiste. Porque como deve interpretar isso:

                   
    $var = 2 * (1 + );

    E se você se esquecesse do resultado final ), receberia uma reclamação sobre o ponto e vírgula inesperado.

  3. Foreach como constant

    Para prefixos de variáveis ​​esquecidos $nas instruções de controle, você verá:

                           
    foreach ($array as wrong) {

    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.

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

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

    Conte seus parênteses ou use um IDE que ajude com isso. Também não escreva código sem espaços. Legibilidade conta.

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

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

    Existem algumas exceções para a construção do identificador, como a variável de escopo local ${references}.

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

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

    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.

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

    function whatever() {
        doStuff()
    }            

    Aqui, o analisador não pode dizer se você talvez ainda queira adicionar + 25;ao resultado da função ou algo mais.

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

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

    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.

  1. Listas de parâmetros

    Por exemplo , funções mal declaradas sem lista de parâmetros não são permitidas:

                     
    function whatever {
    }
  2. Condições da instrução de controle

    E você também não pode ter um ifsem condição .

      
    if {
    }

    O que não faz sentido, obviamente. A mesma coisa para os suspeitos do costume, for/ foreach, while/ do, etc.

    Se você tiver esse erro específico, você definitivamente deve procurar alguns exemplos manuais.

mario
fonte
1
Estava procurando resposta para minha pergunta neste post, mas encontrei resposta para o problema de - "Inesperado {", é por isso que eu queria compartilhar com minha resposta - para mim o problema era a quebra de linha - de alguma forma algumas das minhas arquivos estavam usando quebras de linha do Macintosh, mas quando eu as alterei para quebras de linha do Windows - meu problema (no localhost (WAMP) tudo funciona, mas no linux webserver não) foi resolvido.
Edgars Aivars
@EdgarsAivars Obrigado pelo seu comentário! Quebras de linha específicas da plataforma são realmente um problema incomum e complicado. Provavelmente vou mencionar aqui também. (Foi apenas mencionado como de lado na outra resposta de referência .)
mario
Eu descobri que ficar inesperado} era porque um pedaço do meu código usava a tag curta php <? em vez de <? php - demorei um pouco para encontrar este, pois funcionava em outros servidores.
C7borg 28/09
14

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

Causa: Desequilibrada {e }para blocos de código / e declarações de função ou classe.

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

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

A maioria dos IDEs também destaca chaves, parênteses e parênteses. O que facilita bastante a inspeção de sua correlação:

Correspondência de suporte em um IDE

Expressões não terminadas

E Unexpected $enderro de sintaxe / analisador também pode ocorrer para expressões ou instruções não terminadas:

  • $var = func(1, ?>EOF

Portanto, 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 .:

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

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:e else:e falta, endif;por exemplo.

Veja também:

mario
fonte
14

Inesperado T_IF
Inesperado T_ELSEIF
Inesperado T_ELSE
Inesperado T_ENDIF

Blocos de controle de condicionais if, elseife elseseguem 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.

insira a descrição da imagem aqui

  1. Falta {ou }devido a recuo incorreto

    Chaves de código incompatíveis são comuns a códigos menos bem formatados, 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){

    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.

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

    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 ifexpressões ilegíveis .

  2. IF não pode ser usado em expressões

    Um erro de iniciante surpreendentemente frequente está tentando usar uma ifdeclaração em uma expressão, como uma declaração impressa:

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

    O que é inválido, é claro.

    Você pode usar um condicional ternário , mas cuidado com os impactos de legibilidade.

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

    Caso contrário quebrar tais construções de saída para cima: uso múltiplo ifs e echos .
    Melhor ainda, use variáveis ​​temporárias e coloque suas condicionais antes:

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

    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 ifcomo se isso pudesse retornar um resultado :

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

    O que é estruturalmente idêntico ao uso ifdentro de uma concatenação / expressão de string.

    • Mas as estruturas de controle (se / foreach / while) não têm um "resultado" .
    • A string literal "true" também seria apenas uma declaração nula.

    Você precisará usar uma atribuição no bloco de código :

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

    Como alternativa, recorra a uma ?:comparação ternária.

    Se em Se

    Você não pode aninhar umif dentro de uma condição:

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

    O que é obviamente redundante, porque o and(ou or) já permite comparações de encadeamento.

  3. ;Ponto e vírgula esquecido

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

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

    Btw, a última linha em um {…}bloco de código também precisa de um ponto e vírgula.

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

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

    O que acontece com mais frequência do que você imagina.

    • Quando você encerra a if ()expressão,; ela executa uma declaração nula. O ;torna-se um vazio {}por si só!
    • O {…}bloco, portanto, é desanexado do ife sempre executado.
    • Portanto, elsenão havia mais uma relação com uma ifconstruçã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:

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

    Onde o ;bloco de código após {…}finaliza toda a if construção, cortando o elseramo sintaticamente.

  5. Não usando blocos de código

    É sintaticamente permitido omitir chaves {... }para blocos de código em if/ elseif/ elsebranches. 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:

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

    Mas para realmente usar blocos de código, você precisa escrevê- los {... }como tal!

    Mesmo programadores experientes evitam essa sintaxe sem pulseira, ou pelo menos a entendem como uma exceção excepcional à regra.

  6. Elseif / Elseif na ordem errada

    Uma coisa a lembrar é a ordem condicional , é claro.

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

    Você pode ter quantos elseifs quiser, mas elsetem que ir por último . É assim mesmo.

  7. Declarações de classe

    Como mencionado acima , você não pode ter instruções de controle em uma declaração de classe:

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

    Você esqueceu uma definição de função ou fechou uma }muito cedo nesses casos.

  8. T_ELSEIF / T_ELSE inesperado

    Ao misturar PHP e HTML, o fechamento }de um if/elseifdeve estar no mesmo bloco PHP <?php ?>que o próximo elseif/else. Isso gerará um erro, pois o fechamento }das ifnecessidades de fazer parte do elseif:

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

    A forma correta <?php } elseif:

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

    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 e elseif/ elsetokens estruturais:

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

    Isso só pode ocorrer em {…}blocos de código, não entre os tokens da estrutura de controle.

    • Isso não faria sentido de qualquer maneira. Não é como se houvesse algum estado "indefinido" quando o PHP pulas entre ife elsebranches.
    • Você terá que decidir onde as instruções de impressão pertencem / ou se precisam ser repetidas nos dois ramos.

    Você também não pode separar um if / else entre diferentes estruturas de controle:

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

    Não há relação sintática entre o ife else. O foreachescopo lexical termina em }, então não há sentido para a ifestrutura continuar.

  9. 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 nenhum if:.

    • O uso } endif; é um terminador dobrado if .

    Enquanto um "fim inesperado de $" geralmente é o preço de uma }chave de fechamento esquecida .

  10. Tarefa versus comparação

    Portanto, este não é um erro de sintaxe, mas vale a pena mencionar neste contexto:

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

    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.

mario
fonte
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_S_ALL_
inesperado <
Inesperado Inesperado>

Os operadores de comparação, tais como ==, >=, ===, !=, <>, !==e <=ou <e> principalmente deve ser usado apenas em expressões, tais como ifexpressões. Se o analisador reclamar sobre eles, isso geralmente significa um pareamento incorreto ou ( )parênteses incompatíveis ao seu redor.

  1. Agrupamento de Parens

    Em particular para ifdeclarações com múltiplas comparações, você deve ter o cuidado de contar corretamente os parênteses de abertura e fechamento :

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

    Aqui a ifcondiçã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 .

  2. isset () amassado com comparação

    Um novato comum é pitfal, tentando combinar isset()ou empty()com comparações:

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

    Ou até:

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

    Isso não faz sentido para PHP, porque issete emptysã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.

  3. Confundindo >=maior ou igual ao =>operador de matriz

    Os dois operadores parecem um pouco parecidos e, por vezes, se confundem:

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

    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

  4. Nada para comparar

    Você também não pode combinar duas comparações se elas pertencerem ao mesmo nome de variável:

                     
    if ($xyz > 5 and < 100)

    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

  5. Cadeias de comparação

    Você não pode comparar uma variável com uma linha de operadores:

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

    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.

  6. Inesperado >
    Inesperado<

    Os operadores maiores >ou menores que <não têm um T_XXXnome 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:

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

    Isso equivale a uma string "<a href='z"sendo comparada >a uma constante literal Helloe 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:

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

Veja também:

mario
fonte
11

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, echopode ser usado apenas como declarações. Eles geralmente residem em uma linha por si mesmos.

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

                 
    $x = myfunc()
    if (true) {

    Solução: observe a linha anterior; adicione ponto e vírgula.

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

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

    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.

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

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

    Da mesma forma, você não pode usar um ifem strings, expressões matemáticas ou em outro lugar:

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

    Para incorporar ifcondições semelhantes a uma expressão especificamente, geralmente você deseja usar uma ?:avaliação ternária .

    O mesmo se aplica a for, while, global, echoe em menor extensão list.

              
    echo 123, echo 567, "huh?";

    Considerando que print()é uma linguagem interna que pode ser usada no contexto da expressão. (Mas raramente faz sentido.)

  4. Palavras-chave reservadas como identificadores

    Você também não pode usar doou ifoutras 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.)

mario
fonte
7

Inesperado '?'

Se você estiver tentando usar o operador coalescente nulo ??em uma versão do PHP anterior ao PHP 7, receberá este erro.

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

Inesperado '?', Esperando variável

Um erro semelhante pode ocorrer para tipos anuláveis, como em:

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

O que novamente indica que uma versão PHP desatualizada está sendo usada (a versão CLI php -vou o servidor da Web vinculado phpinfo();).

John Conde
fonte
5

T_LNUMBER inesperado

O token T_LNUMBERrefere-se a um número "longo".

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

    $1   // Bad
    $_1  // Good

    *

    • Muitas vezes surge com o uso de preg_replace-placeholders "$1"no contexto do PHP:

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

      Onde o retorno de chamada deveria ter sido citado. (Agora, o /esinalizador regex foi descontinuado. Mas, às vezes, ainda é mal utilizado nas preg_replace_callbackfunções.)

    • A mesma restrição de identificador se aplica às propriedades do objeto , btw.

             
      $json->0->value
    • Enquanto o tokenizer / analisador não permite um literal $1como 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 literal 1).

  2. Entrada de matriz dispersa

    Um longo inesperado também pode ocorrer para declarações de matriz - quando faltam ,vírgulas:

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

    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.

  3. HTML incorreto

    E, novamente, cadeias de caracteres erradas são uma fonte frequente de números dispersos:

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

    Esses casos devem ser tratados mais ou menos como erros inesperados de T_STRING .

  4. Outros identificadores

    Nem funções, classes nem espaços para nome podem ser nomeados começando com um número:

             
    function 123shop() {

    Praticamente o mesmo que para nomes de variáveis.

mario
fonte
2

Inesperado '='

Isso pode ser causado por caracteres inválidos em um nome de variável. Os nomes das variáveis devem seguir estas regras:

Os nomes de variáveis ​​seguem as mesmas regras que outros rótulos no PHP. Um nome de variável válido começa com uma letra ou sublinhado, seguido por qualquer número de letras, números ou sublinhados. Como expressão regular, seria expresso assim: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'

John Conde
fonte
Boa adição, John.
Funk Quarenta Niner
1

'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ível foreachouif 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);;

mario
fonte
1

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:

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

No PHP 7.4, você poderia usá-lo para expressões Array .

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

Tempo de espera inesperado (T_ENDWHILE)

A sintaxe está usando dois pontos - se não houver dois pontos, o erro acima ocorrerá.

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

A alternativa a essa sintaxe é usar colchetes:

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

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

mplungjan
fonte
0

Uma mensagem de erro iniciada Parse error: syntax error, unexpected ':'pode ser causada por escrever incorretamente uma referência estática de classe Class::$Variablecomo Class:$Variable.

David Spector
fonte