PHP Sintaxe

Toda língua tem gramática: no português, a frase termina com ponto, o nome próprio começa com maiúscula. A sintaxe é a gramática de uma linguagem de programação: as regras de como as instruções são escritas. O PHP é bem mais rígido que um leitor humano: um ; faltando e ele se recusa a rodar. Nesta aula você vai conhecer as regras básicas, de uma vez por todas, para errar menos e entender as mensagens quando errar.

Você vai aprender
  • O que é uma instrução e por que ela termina com ;.
  • O que são blocos { } e por que toda chave aberta precisa ser fechada.
  • Onde maiúsculas e minúsculas fazem diferença (variáveis, constantes) e onde não fazem (funções, palavras do PHP).
  • O papel dos espaços e das quebras de linha.
  • As regras para nomes de variáveis e o $.
  • O que são palavras reservadas.
  • O padrão de escrita da comunidade, o PSR-12.

Instruções e o ponto e vírgula

Uma instrução (statement) é uma ordem completa para o PHP: "escreva isto", "guarde aquilo", "some estes números". No português, cada frase termina com um ponto. No PHP, cada instrução termina com ponto e vírgula:

<?php
$preco = 10;                     // instrução 1: guarda 10 em $preco
$quantidade = 3;                 // instrução 2
$total = $preco * $quantidade;   // instrução 3: faz a conta e guarda
echo "Total: $total\n";          // instrução 4: escreve

(O que vem depois de // é um comentário, uma anotação para quem lê, que o PHP ignora. Aula própria: Comentários.)

O PHP executa as instruções uma de cada vez, de cima para baixo, na ordem em que aparecem. Por isso a conta da linha 4 já encontra $preco e $quantidade com valor: elas foram criadas antes.

O ; é o único jeito de o PHP saber onde uma instrução acaba. Quando ele falta, o PHP "emenda" a instrução com a seguinte e se perde:

<?php
echo "Olá, mundo!"
echo "Tchau!";
$ php a.php

Parse error: syntax error, unexpected token "echo", expecting "," or ";" in /home/ana/t/a.php on line 3

Lembre-se da dica da aula Olá, Mundo: o PHP aponta a linha onde percebeu o problema (a 3, onde encontrou um echo sem que a instrução anterior tivesse terminado), e o ; que falta está no fim da linha anterior.

Duas exceções
  • A última instrução antes de um ?> dispensa o ; (o ?> já termina a instrução). É por isso que <?= $nome ?> não tem ponto e vírgula.
  • Linhas que abrem ou fecham um bloco, como if (…) { e }, não levam ;: elas não são instruções, são a "moldura" de um grupo de instruções (próxima seção).

Blocos: chaves { }

Às vezes várias instruções precisam andar juntas: "se a nota for 7 ou mais, faça isto e isto". As chaves agrupam instruções num bloco, como um parêntese grande:

<?php
$nota = 8;
if ($nota >= 7) {
    echo "Aprovada!\n";
    echo "Parabéns, Ana.\n";
}
echo "Fim do boletim.\n";
if ($nota >= 7)
Uma condição: "se a nota for maior ou igual a 7". O if tem aula própria, if, elseif, else.
{
Abre o bloco: o que vem a seguir só roda se a condição for verdadeira.
as duas linhas com echo
As instruções do bloco, cada uma com o seu ;. Elas ficam recuadas 4 espaços, para os olhos verem que estão "dentro".
}
Fecha o bloco. Sem ; depois.
a última linha
Está fora do bloco: roda sempre.
$ php bloco.php
Aprovada!
Parabéns, Ana.
Fim do boletim.

O recuo é só para quem lê: o PHP se guia pelas chaves. Mas um código sem recuo, ou com recuo errado, engana as pessoas, e é aí que os erros nascem. Os blocos aparecem em decisões (if), repetições (for, while, foreach), funções e classes.

Toda chave aberta precisa ser fechada

O PHP confere se as chaves formam pares. Dois arquivos com erro de propósito, um com chave faltando e outro com chave sobrando:

<?php
if (10 > 5) {
    echo "dez é maior\n";
<?php
echo "a\n";
}
echo "b\n";

As mensagens são diretas:

$ php chave.php

Parse error: Unclosed '{' on line 2 in /home/ana/sx/chave.php on line 4
$ php chave2.php

Parse error: Unmatched '}' in /home/ana/sx/chave2.php on line 3
  • Unclosed '{' on line 2: "{ não fechada, aberta na linha 2". O arquivo acabou (linha 4) com uma chave ainda aberta. A mensagem diz onde ela foi aberta.
  • Unmatched '}': "} sem par", na linha 3. Há uma chave fechando algo que nunca foi aberto.

Os editores de código ajudam: ao colocar o cursor numa chave, eles destacam o par dela.


Maiúsculas e minúsculas

Aqui o PHP tem uma regra que surpreende: às vezes maiúsculas e minúsculas fazem diferença, às vezes não. O termo técnico é sensível a maiúsculas (case-sensitive).

O quêDiferencia maiúsculas?Exemplo
VariáveisSim$nome, $Nome e $NOME são três variáveis diferentes
ConstantesSimTAXA e taxa são diferentes
Palavras do PHP (echo, if, else, function…)Nãoecho, ECHO e Echo funcionam
Funções (as do PHP e as suas)Nãostrtoupper e STRTOUPPER funcionam
Nomes de classesNão(aula Classes e Objetos)

Variáveis: diferenciam

<?php
$nome = "Ana";
$Nome = "Bruno";
$NOME = "Carla";
echo $nome, " ", $Nome, " ", $NOME, "\n";
echo $nOME;
$ php caixa.php
Ana Bruno Carla                       « três variáveis diferentes

Warning: Undefined variable $nOME in /home/ana/sx/caixa.php on line 6

As vírgulas no echo separam várias coisas a escrever (aula echo e print). E $nOME nunca foi criada: o PHP avisa com Warning: Undefined variable ("variável não definida"). É um aviso, não um erro fatal: o programa continua, usando "nada" no lugar da variável. Esse é um dos erros mais comuns de iniciante: criar $total e depois escrever $Total.

Funções e palavras do PHP: não diferenciam

<?php
function saudar()
{
    echo "Olá!\n";
}
saudar();
SAUDAR();
Saudar();
echo STRTOUPPER("php"), "\n";
ECHO "fim\n";
$ php funcoes.php
Olá!
Olá!                « SAUDAR() chamou a mesma função
Olá!
PHP
fim

As três chamadas acharam a mesma função saudar (você vai criar funções em Funções), e STRTOUPPER e ECHO funcionaram. O mesmo vale para IF, ELSE e companhia:

<?php
IF (10 > 5) {
    ECHO "dez é maior\n";
} ELSE {
    ECHO "cinco é maior\n";
}
$ php palavras.php
dez é maior

Funciona, mas não faça. O costume (e o padrão PSR-12) é escrever palavras do PHP sempre em minúsculas e chamar cada função exatamente como ela foi declarada. Código com maiúsculas misturadas confunde quem lê e as ferramentas que buscam por nome.

Constantes: diferenciam

<?php
define("TAXA", 5);
echo TAXA, "\n";
echo taxa, "\n";
$ php constante.php
5

Fatal error: Uncaught Error: Undefined constant "taxa" in /home/ana/sx/constante.php:4
Stack trace:
#0 {main}
  thrown in /home/ana/sx/constante.php on line 4

Uma constante é um valor com nome que não muda (aula Constantes). TAXA existe; taxa, não. Repare na diferença de gravidade: variável inexistente gera um Warning e o programa segue; constante inexistente gera um Fatal error e o programa para.

Missão: o programa deveria mostrar Total: 30, mas dá um aviso e mostra Total: vazio. Rode, leia o aviso (qual variável ele diz que não existe?) e conserte o nome.

<?php
$preco = 10;
$quantidade = 3;
$total = $preco * $quantidade;
echo "Total: $Total\n";
<?php
$preco = 10;
$quantidade = 3;
$total = $preco * $quantidade;
echo "Total: $total\n";

Espaços e quebras de linha

Fora das aspas, o PHP é tolerante com espaços: entre os pedaços de uma instrução, um espaço, dez espaços ou uma quebra de linha valem o mesmo. Até nenhum espaço, quando não há perigo de confusão:

<?php
echo"colado\n";
echo     "espaçado\n"    ;
echo "a\n"; echo "b\n"; echo "c\n";
echo
    "em várias linhas\n"
;
$ php espacos.php
colado
espaçado
a
b
c
em várias linhas

Tudo funcionou: instrução sem espaço, com espaços demais, três instruções numa linha, uma instrução em três linhas. O que não pode é colocar espaço dentro de uma palavra ou de um nome, porque aí ela vira duas:

$ php ecoq.php                « o arquivo tem: e cho "oi";

Parse error: syntax error, unexpected identifier "cho" in /home/ana/sx/ecoq.php on line 2

E, dentro das aspas, cada espaço conta: "a b" escreve dois espaços entre as letras.

Ser tolerante não quer dizer que tanto faz. A regra de ouro: uma instrução por linha, um espaço em volta de = e dos operadores ($total = $preco * $quantidade;), recuo de 4 espaços dentro de blocos. Seus olhos (e os de quem for ler o seu código) agradecem.


Variáveis: o $ e as regras dos nomes

Toda variável começa com $ (cifrão). É assim que o PHP sabe que $nome é uma variável e nome seria outra coisa (uma constante ou uma função). O $ faz parte do nome e está sempre lá: ao criar, ao usar, ao mudar. A aula Variáveis explica tudo sobre elas; aqui ficam as regras de escrita do nome:

RegraVálidoInválido
Começa com $ seguido de letra ou _$nome, $_contador$1lugar
Depois: letras, números e _$aluno2, $nome_completo$nome-completo (o - é subtração)
Sem espaços$nomeCompleto$nome completo
Acentos são aceitos (mas evite)$ação
<?php
$nomeCompleto = "Ana Souza";
$nome_completo = "Ana Souza";
$_contador = 1;
$ação = "comprar";
$class = "3º ano";
echo "$nomeCompleto | $nome_completo | $_contador | $ação | $class\n";
$ php nomes.php
Ana Souza | Ana Souza | 1 | comprar | 3º ano

Todos esses nomes funcionam. O acento funciona, mas evite: outras pessoas podem não conseguir digitá-lo, e alguns programas o estragam. O costume no PHP é o camelCase ($nomeCompleto, cada palavra nova com maiúscula, como as corcovas de um camelo); $nome_completo também aparece bastante. Escolha um e seja coerente. E os erros dos nomes inválidos:

$ php num.php                 « $1lugar = "Ana";

Parse error: syntax error, unexpected integer "1", expecting variable or "{" or "$" in /home/ana/sx/num.php on line 2
$ php espaco.php              « $nome completo = "Ana";

Parse error: syntax error, unexpected identifier "completo" in /home/ana/sx/espaco.php on line 2

Palavras reservadas

Algumas palavras têm significado especial no PHP: echo, if, else, function, class, return… São as palavras reservadas (ou palavras-chave). Elas não podem ser usadas como nome de função, de classe ou de constante:

$ php reserv.php              « function echo() { }

Parse error: syntax error, unexpected token "echo", expecting "(" in /home/ana/sx/reserv.php on line 2
$ php reserv2.php             « function list() { }

Parse error: syntax error, unexpected token "list", expecting "(" in /home/ana/sx/reserv2.php on line 2

O PHP esperava o nome da função e encontrou uma palavra dele. Já em variáveis não há problema, graças ao $: o $class do exemplo anterior funcionou. As palavras reservadas mais comuns:

GrupoPalavras
Escreverecho, print
Decisõesif, else, elseif, switch, case, default, match
Repetiçõesfor, foreach, as, while, do, break, continue
Funçõesfunction, fn, return, static, global
Classesclass, new, extends, interface, trait, enum, public, private, protected, readonly
Errostry, catch, finally, throw
Arquivos e nomesinclude, require, namespace, use
Outraslist, array, isset, unset, empty, exit, die, and, or, xor, const, instanceof

Não precisa decorar: o editor colore as palavras reservadas com uma cor própria, e o PHP avisa com um Parse error se você tropeçar numa. A lista completa está no manual do PHP, em "List of Keywords".


O padrão de estilo: PSR-12

O PHP aceita muitas formas de escrever a mesma coisa. Para que o código de pessoas diferentes tenha a mesma cara, a comunidade criou recomendações chamadas PSR (PHP Standards Recommendations). A de estilo é a PSR-12 (atualizada pelo PER Coding Style). Algumas regras que o guia segue desde já:

  • Arquivos começam com <?php e, se só têm PHP, não terminam com ?>.
  • Recuo de 4 espaços (não tabulação).
  • Palavras do PHP em minúsculas: if, true, null.
  • Uma instrução por linha.
  • Um espaço depois de if, for, foreach, while, antes do parêntese: if ($nota >= 7) {.
  • Em if e laços, a chave abre na mesma linha; em funções e classes, na linha de baixo.
  • Linhas de até 120 caracteres (de preferência, 80).

Ninguém confere isso à mão: os editores formatam sozinhos (aula Editores e IDEs) e ferramentas como o PHP CS Fixer corrigem projetos inteiros. A aula Padrões PSR mostra as outras recomendações.


Quando dá errado

Os erros de sintaxe vêm todos como Parse error e impedem o programa de começar: nenhuma linha roda. Um resumo dos que você viu nesta aula:

MensagemCausa mais comumOnde procurar
unexpected token "echo", expecting "," or ";"Faltou ;No fim da linha anterior à indicada
unexpected end of fileAlgo abriu e não fechou: aspas, parêntese, foreach:Do fim do arquivo para cima
Unclosed '{' on line NChave aberta na linha N e nunca fechadaNa linha N e no bloco dela
Unmatched '}'Chave fechando sem ter sido abertaNa linha indicada; às vezes falta o { lá em cima
unexpected identifier "…"Espaço no meio de um nome ou palavraNa linha indicada
unexpected integer "1", expecting variableNome de variável começando com númeroNa linha indicada

E os dois que não são de sintaxe (o programa roda até chegar neles):

"Undefined variable $Total" e o valor sai vazio

O que aconteceu: maiúscula ou minúscula diferente da usada na criação ($total × $Total), ou um erro de digitação. Como variáveis diferenciam maiúsculas, para o PHP é outra variável, que nunca recebeu valor.

Como resolver: copie o nome exato de onde a variável foi criada. Escolher um estilo só (camelCase) evita a maioria desses casos.

"Undefined constant" e o programa para

O que aconteceu: a constante foi escrita com maiúsculas diferentes, ou você esqueceu o $ de uma variável (echo nome; procura uma constante nome).

Como resolver: confira o $ e as maiúsculas. A aula Lendo Erros do PHP mostra esse e outros erros comuns.


Referência

RegraResumo
;Termina cada instrução (dispensável antes de ?>; não vai depois de { nem de }).
{ }Agrupam instruções num bloco; sempre aos pares.
OrdemAs instruções rodam de cima para baixo.
Variáveis e constantesDiferenciam maiúsculas.
Palavras do PHP, funções, classesNão diferenciam (mas escreva sempre igual).
Espaços e quebras de linhaLivres entre os pedaços; proibidos dentro de nomes; contam dentro de aspas.
$nome$ + letra ou _ + letras, números, _.
Palavras reservadasNão podem ser nome de função, classe ou constante.
EstiloPSR-12: 4 espaços, minúsculas, uma instrução por linha.

Para fechar, aplique as regras. Este programa tem três erros: uma chave, um ponto e vírgula e um nome de variável. Conserte um de cada vez, lendo a mensagem do PHP a cada rodada:

Missão: faça o programa escrever, sem nenhum aviso, as três linhas Nota: 8, Aprovada! e Fim do boletim.

<?php
$nota = 8;
echo "Nota: $Nota\n"
if ($nota >= 7) {
    echo "Aprovada!\n";

echo "Fim do boletim.\n";
<?php
$nota = 8;
echo "Nota: $nota\n";
if ($nota >= 7) {
    echo "Aprovada!\n";
}
echo "Fim do boletim.\n";

Exercícios

1. Qual destes pares se refere à mesma coisa no PHP?

2. Qual destes nomes de variável é inválido?

3. A mensagem é Parse error: Unclosed '{' on line 5 in … on line 12. O que aconteceu?

4. O que acontece com echo "a"; echo "b"; escrito numa linha só?

5. O recuo do PSR-12

Quantos espaços de recuo o padrão PSR-12 usa dentro de um bloco?

espaços

Resumo

  • Cada instrução termina com ;, e as instruções rodam de cima para baixo.
  • { } agrupam instruções em blocos; toda chave aberta precisa ser fechada (Unclosed '{', Unmatched '}').
  • Variáveis e constantes diferenciam maiúsculas; palavras do PHP, funções e classes não (mas escreva sempre igual, em minúsculas).
  • Espaços e quebras de linha são livres entre os pedaços, proibidos dentro de nomes e contam dentro de aspas.
  • Variáveis: $ + letra ou _, depois letras, números e _; prefira camelCase.
  • Palavras reservadas não podem ser nome de função ou classe.
  • Estilo: PSR-12 (4 espaços, uma instrução por linha); deixe o editor formatar.
  • Próximo passo: Comentários.