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.
- 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.
- 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
iftem 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áveis | Sim | $nome, $Nome e $NOME são três variáveis diferentes |
| Constantes | Sim | TAXA e taxa são diferentes |
Palavras do PHP (echo, if, else, function…) | Não | echo, ECHO e Echo funcionam |
| Funções (as do PHP e as suas) | Não | strtoupper e STRTOUPPER funcionam |
| Nomes de classes | Nã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:
| Regra | Válido | Invá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:
| Grupo | Palavras |
|---|---|
| Escrever | echo, print |
| Decisões | if, else, elseif, switch, case, default, match |
| Repetições | for, foreach, as, while, do, break, continue |
| Funções | function, fn, return, static, global |
| Classes | class, new, extends, interface, trait, enum, public, private, protected, readonly |
| Erros | try, catch, finally, throw |
| Arquivos e nomes | include, require, namespace, use |
| Outras | list, 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
<?phpe, 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
ife 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:
| Mensagem | Causa mais comum | Onde procurar |
|---|---|---|
unexpected token "echo", expecting "," or ";" | Faltou ; | No fim da linha anterior à indicada |
unexpected end of file | Algo abriu e não fechou: aspas, parêntese, foreach: | Do fim do arquivo para cima |
Unclosed '{' on line N | Chave aberta na linha N e nunca fechada | Na linha N e no bloco dela |
Unmatched '}' | Chave fechando sem ter sido aberta | Na linha indicada; às vezes falta o { lá em cima |
unexpected identifier "…" | Espaço no meio de um nome ou palavra | Na linha indicada |
unexpected integer "1", expecting variable | Nome de variável começando com número | Na linha indicada |
E os dois que não são de sintaxe (o programa roda até chegar neles):
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.
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
| Regra | Resumo |
|---|---|
; | Termina cada instrução (dispensável antes de ?>; não vai depois de { nem de }). |
{ } | Agrupam instruções num bloco; sempre aos pares. |
| Ordem | As instruções rodam de cima para baixo. |
| Variáveis e constantes | Diferenciam maiúsculas. |
| Palavras do PHP, funções, classes | Não diferenciam (mas escreva sempre igual). |
| Espaços e quebras de linha | Livres entre os pedaços; proibidos dentro de nomes; contam dentro de aspas. |
$nome | $ + letra ou _ + letras, números, _. |
| Palavras reservadas | Não podem ser nome de função, classe ou constante. |
| Estilo | PSR-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?
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.