PHP Variáveis
Todo programa precisa guardar coisas enquanto trabalha: o nome de quem está comprando, o preço de um produto, quantas maçãs sobraram na lojinha. Em PHP, cada coisa guardada fica numa variável, e toda variável começa com um cifrão: $nome, $preco, $quantidade. Nesta aula você vai criar suas primeiras variáveis, mudar o valor delas, escolher bons nomes e entender o aviso que o PHP mostra quando você usa uma variável que não existe.
- O que é uma variável e como criar uma:
$nome = "Ana";. - Como mostrar o valor de uma variável e como trocá-lo por outro.
- Quais nomes o PHP aceita e por que
$nomee$Nomesão variáveis diferentes. - O que significa
Warning: Undefined variablee como evitá-lo. - Como perguntar "esta variável existe?" com
issete como apagar uma comunset. - A ideia das "variáveis variáveis" (
$$), só para reconhecê-las.
Todos os programas desta aula foram executados com o PHP 8.5 na máquina fictícia da Ana (usuária ana, computador notebook), na pasta ~/site, com o comando php arquivo.php (veja PHP na Linha de Comando). Você pode repetir cada um no editor do guia, que roda o PHP de verdade no navegador.
A ideia: uma caixa com etiqueta
Pense numa mudança de casa. Você guarda as coisas em caixas e escreve uma etiqueta em cada uma: "LIVROS", "PANELAS". Depois, quando quer as panelas, não abre todas as caixas: procura pela etiqueta.
Uma variável é isso: um espacinho na memória do computador com uma etiqueta. A etiqueta é o nome da variável; o que está dentro é o valor. O nome "variável" vem justamente daí: o que está dentro pode variar, ser trocado quantas vezes você quiser.
| Parte da caixa | Nome técnico | Exemplo |
|---|---|---|
| A etiqueta | nome da variável | $nome, $preco |
| O que está guardado agora | valor | "Ana", 4.5, 29 |
| O tipo de coisa guardada | tipo | texto, número inteiro, número com vírgula… |
Em muitas linguagens (Java, C) você precisa dizer de antemão o tipo da caixa: "esta caixa só aceita números". Em PHP, não: a caixa aceita qualquer coisa, e o PHP descobre o tipo olhando o valor que você colocou. Isso se chama tipagem dinâmica, e você vai estudá-la na próxima aula, Tipos de Dados.
1. Criar uma variável
Para criar uma variável, escreva o nome dela (com o cifrão), um sinal de igual e o valor. Pronto: não existe um comando especial de "criar". A variável passa a existir na primeira vez que recebe um valor.
<?php $nome = "Ana"; echo $nome;
- <?php
- Abre o código PHP. Tudo o que vem depois é programa (veja Sintaxe).
- $
- O cifrão avisa: "isto é uma variável". Em PHP, toda variável começa com
$, sem exceção. - nome
- O nome (a etiqueta). Juntos,
$nomeé o nome completo da variável. - =
- O sinal de atribuição. Leia como "recebe": $nome recebe "Ana". Não é o "igual" da matemática; quem compara valores é o
==/===(aula Comparação). - "Ana"
- O valor: um texto. Texto em PHP sempre vai entre aspas (veja Strings).
- ;
- O ponto e vírgula termina a instrução, como o ponto final de uma frase.
- echo $nome;
echo("ecoar") mostra o valor da variável na tela (veja echo e print).
$ php ola.php Anaana@notebook:~/site$ « o prompt colou no "Ana": o echo não pula linha
O echo mostra o que está dentro da caixa (Ana), não o nome dela. E ele não pula linha sozinho: o prompt $ do terminal apareceu grudado no Ana. Para pular linha, acrescente "\n" (barra invertida + n, a "quebra de linha"):
<?php $nome = "Ana"; $idade = 29; $preco = 4.5; echo $nome, "\n"; echo $idade, "\n"; echo $preco, "\n"; echo "$nome tem $idade anos.\n";
$ php ola.php Ana 29 4.5 Ana tem 29 anos.
Repare em três coisas:
- Números não levam aspas.
29é o número vinte e nove;"29"seria um texto com os caracteres 2 e 9. A diferença importa em contas e comparações (aula Conversão de Tipos). - Números com vírgula usam ponto:
4.5, e não4,5. O PHP segue a escrita dos Estados Unidos. Para mostrar4,50ao usuário, existe onumber_format(aula Formatar Números). - Dentro de aspas duplas, a variável é trocada pelo valor:
"$nome tem $idade anos."virouAna tem 29 anos.. Isso se chama interpolação e tem aula própria: Interpolação. A vírgula emecho $nome, "\n"só separa duas coisas que oechovai mostrar uma depois da outra.
Experimente: troque o valor de $fruta e de $quantidade e clique em Rodar. Depois crie uma terceira variável, $cor, e mostre-a também.
<?php $fruta = "maçã"; $quantidade = 6; echo "A Ana comprou $quantidade unidades de $fruta.\n";
2. Mudar o valor
Para trocar o que está na caixa, basta atribuir de novo. O valor antigo é jogado fora e o novo entra no lugar:
<?php $fruta = "maçã"; echo "Antes: $fruta\n"; $fruta = "banana"; echo "Depois: $fruta\n";
$ php mudar.php Antes: maçã Depois: banana
O PHP executa as linhas de cima para baixo. Na linha 3, $fruta ainda vale "maçã"; a linha 4 troca o valor; a linha 5 já vê "banana".
Usar o valor antigo para calcular o novo
Uma linha como $qtd = $qtd + 2; parece estranha para quem lembra da matemática ("um número igual a ele mais dois?"). Mas lembre: = é "recebe". O PHP primeiro calcula o lado direito com o valor atual e depois guarda o resultado na caixa:
<?php $qtd = 3; $qtd = $qtd + 2; echo $qtd, "\n";
$ php estoque.php 5
$qtd = 3;→ a caixa guarda3.$qtd + 2→ o PHP lê o valor atual (3) e soma:5.$qtd = 5→ o resultado vai para a caixa, no lugar do 3.
Esse padrão é tão comum que tem um atalho, $qtd += 2;, explicado em Operadores de Atribuição.
A caixa aceita outro tipo de valor
Como o PHP não prende a variável a um tipo, a mesma variável pode guardar um texto agora e um número depois:
<?php $fruta = "banana"; $fruta = 10; var_dump($fruta);
$ php tipo.php int(10) « var_dump mostra o tipo (int = número inteiro) e o valor
O var_dump é a "lupa" do programador PHP: mostra o tipo e o valor de qualquer coisa. Ele tem aula própria, var_dump e print_r. Funcionar, funciona; mas trocar o tipo de uma variável no meio do programa costuma confundir quem lê o código. Prefira que cada variável guarde sempre o mesmo tipo de coisa.
Copiar uma variável para outra
Quando você escreve $b = $a;, o PHP copia o valor de $a para $b. Depois disso, as duas caixas são independentes:
<?php $a = 1; $b = $a; $a = 5; echo "a=$a b=$b\n";
$ php copia.php a=5 b=1 « mudar $a depois não mexeu em $b
Existe um jeito de fazer duas variáveis apontarem para a mesma caixa ($b = &$a;, a "referência"), apresentado em Operadores de Atribuição. No dia a dia, a cópia é o que você quer.
3. Regras para o nome
O nome de uma variável segue quatro regras. Quebrar qualquer uma delas faz o PHP recusar o programa inteiro, antes de rodar a primeira linha.
- Começa com
$. - Depois do cifrão, vem uma letra ou um sublinhado (
_). Nunca um número. - O resto pode ter letras, números e sublinhados. Sem espaços, sem hífen, sem pontuação.
$thisé reservado (ele aparece nas aulas de Classes e Objetos).
| Nome | Vale? | Por quê |
|---|---|---|
$nome | Sim | Só letras. |
$item2 | Sim | Números podem vir depois da primeira letra. |
$_total | Sim | Pode começar com sublinhado. |
$nome_completo, $nomeCompleto | Sim | Sublinhado ou maiúscula no meio separam as palavras. |
$preço | Sim, mas evite | O PHP aceita letras acentuadas, mas nem todo teclado e editor lida bem com elas. Use $preco. |
$1nome | Não | Começa com número. |
$minha-variavel | Não | O hífen é o sinal de menos: o PHP lê "$minha menos variavel". |
$minha variavel | Não | O espaço corta o nome em dois. |
nome (sem $) | Não | Sem o cifrão, não é variável. |
$this | Não | Reservado para a programação orientada a objetos. |
Veja o que o PHP responde a cada nome errado. Cada programa abaixo tem só a linha 2 com o erro:
$ cat a.php
<?php
$1nome = "Ana";
$ php a.php
Parse error: syntax error, unexpected integer "1", expecting variable or "{" or "$" in /home/ana/site/a.php on line 2
$ echo $?
255 « código de saída 255: o programa nem chegou a rodar
$ php b.php « $minha-variavel = "Ana"; Parse error: syntax error, unexpected token "=" in /home/ana/site/b.php on line 2 $ php c.php « $minha variavel = "Ana"; Parse error: syntax error, unexpected identifier "variavel" in /home/ana/site/c.php on line 2 $ php e.php « nome = "Ana"; (sem o cifrão) Parse error: syntax error, unexpected token "=" in /home/ana/site/e.php on line 2
Parse error quer dizer "erro de leitura": o PHP lê o arquivo inteiro antes de executar, e parou porque achou algo que não faz sentido na gramática da linguagem. Unexpected = "inesperado". Em $minha-variavel = "Ana", o PHP leu $minha - variavel (uma conta) e depois encontrou um = onde não cabe atribuição. Como ler essas mensagens com calma é assunto da aula Lendo Erros do PHP.
$ php d.php « $this = 1;
Fatal error: Cannot re-assign $this in /home/ana/site/d.php on line 2
Stack trace:
#0 {main}
Cannot re-assign $this = "não é possível atribuir de novo a $this". Escolha outro nome.
Convenções: como os programadores PHP costumam escrever
Além das regras (que o PHP exige), existem convenções (combinados entre programadores, que o PHP não confere):
- Nomes que dizem o que guardam.
$precoTotalé melhor que$ptou$x. - Um estilo só no projeto. Os dois mais comuns são
$nomeCompleto("camelCase", a corcova do camelo no meio) e$nome_completo("snake_case", palavras ligadas por sublinhado). Os padrões modernos da comunidade (PSR) e a maioria dos frameworks usam camelCase; o próprio PHP usa snake_case nos nomes das funções (str_replace). Neste guia, usamos camelCase nas variáveis. - Sem acentos e em minúsculas no começo:
$preco,$quantidade.
4. Maiúsculas e minúsculas fazem diferença
Para o PHP, $nome, $Nome e $NOME são três variáveis diferentes. Uma letra trocada já basta para o PHP não achar a caixa:
<?php $nome = "Ana"; echo $Nome; ECHO $nome, "\n";
$ php maiusculas.php Warning: Undefined variable $Nome in /home/ana/site/maiusculas.php on line 3 Ana
Linha a linha:
| Linha | O que acontece |
|---|---|
| 2 | Cria $nome (com n minúsculo). |
| 3 | Procura $Nome (com N maiúsculo). Não existe: aviso Undefined variable $Nome, e o echo não mostra nada. |
| 4 | ECHO em maiúsculas funciona, e $nome existe: aparece Ana. |
ECHO funcionou?
No PHP, as palavras da linguagem (echo, if, while…) e os nomes de funções (strlen, STRLEN) não diferenciam maiúsculas de minúsculas. Já as variáveis diferenciam. Na prática, escreva tudo em minúsculas e trate qualquer diferença de letra como erro.
Missão: este programa deveria mostrar Bem-vinda, Ana!, mas mostra um aviso. Rode, leia o aviso (qual variável o PHP não achou?) e corrija só a linha do echo.
<?php $nomeCliente = "Ana"; echo "Bem-vinda, $nomecliente!\n";
<?php $nomeCliente = "Ana"; echo "Bem-vinda, $nomeCliente!\n";
5. Usar uma variável que não existe
Se você usa uma variável que nunca recebeu valor (ou escreveu o nome errado), o PHP não para o programa. Ele mostra um aviso (Warning), trata a variável como vazia (o valor null, aula null) e segue em frente. Isso pode esconder erros de conta:
<?php $total = $preco + 1; echo "Total: $total\n";
$ php total.php Warning: Undefined variable $preco in /home/ana/site/total.php on line 2 Total: 1 $ echo $? 0 « código 0: para o sistema, o programa "deu certo"
- Warning:
- "Aviso". É um problema, mas o PHP decidiu continuar. Diferente de
Fatal erroreParse error, que param tudo. - Undefined variable $preco
- "Variável indefinida
$preco": ninguém deu valor a ela antes desta linha. - in /home/ana/site/total.php
- Em qual arquivo. No editor do guia, aparece o caminho do arquivo dentro do navegador, que é outro.
- on line 2
- Em qual linha. Comece a procurar por ela.
A conta continuou como se $preco fosse zero, e o resultado saiu Total: 1: um número errado, sem nenhum erro "de verdade". Por isso, nunca ignore um Warning. Em uma página web, o aviso aparece no meio do HTML (ou só no registro de erros do servidor, dependendo da configuração), o que é ainda mais fácil de deixar passar. As configurações de exibição de erros são assunto de Tipos de Erro.
O PHP sempre escreve uma linha em branco antes da mensagem, para ela não grudar no texto que o seu programa já mostrou. Isso é normal.
6. isset: "esta variável existe?" e unset: "apague"
Às vezes você não sabe se uma variável existe: ela pode depender de um formulário que o visitante preencheu ou não. Para perguntar sem levar um Warning, use isset (de is set, "está definida?"). Ele responde true (verdadeiro) ou false (falso), os valores booleanos.
Para apagar uma variável, use unset ("desdefinir"). Depois dele, é como se a variável nunca tivesse existido.
<?php $nome = "Ana"; var_dump(isset($nome)); var_dump(isset($idade)); $vazio = null; var_dump(isset($vazio)); $zero = 0; var_dump(isset($zero)); var_dump(isset($nome, $idade)); unset($nome); var_dump(isset($nome)); echo $nome; echo "fim\n";
$ php isset.php bool(true) « linha 3: $nome existe bool(false) « linha 4: $idade nunca foi criada (e não houve Warning!) bool(false) « linha 6: $vazio existe, mas vale null bool(true) « linha 8: zero é um valor como outro qualquer bool(false) « linha 9: com várias, só dá true se TODAS existirem bool(false) « linha 11: depois do unset, $nome sumiu Warning: Undefined variable $nome in /home/ana/site/isset.php on line 12 fim
Os detalhes importantes:
| Situação | isset($x) |
|---|---|
$x nunca foi criada | false (sem Warning) |
$x = null; | false: para o isset, valer null é o mesmo que não existir |
$x = 0;, $x = "";, $x = false; | true: são valores (mesmo que "vazios") |
depois de unset($x); | false |
isset($a, $b, $c) | true só se as três existirem e não forem null |
O uso mais comum do isset é dentro de um if, para decidir o que fazer. Um atalho moderno para "use a variável se existir, senão use um valor padrão" é o operador ??: echo $nome ?? "visitante";. Ele tem aula própria, ?? e ?->.
isset e unset não são funções comuns
Eles parecem funções, mas são construções da linguagem: só aceitam variáveis entre os parênteses. isset("Ana") para o programa com Fatal error: Cannot use isset() on the result of an expression (you can use "null !== expression" instead) ("não é possível usar isset() no resultado de uma expressão"). É por isso que o isset consegue olhar uma variável inexistente sem provocar o Warning.
Você pode apagar várias de uma vez: unset($a, $b);. Apagar é raro em programas pequenos (o PHP joga todas as variáveis fora sozinho quando o programa termina); vai ser mais útil para tirar itens de um array.
Experimente: rode como está. Depois apague a linha $cupom = "PROMO10"; e rode de novo: o que muda? E se trocar por $cupom = null;?
<?php $cupom = "PROMO10"; var_dump(isset($cupom)); unset($cupom); var_dump(isset($cupom));
7. Variáveis variáveis ($$): só a ideia
O PHP tem um recurso curioso: usar o valor de uma variável como nome de outra. Isso se chama "variável variável" e se escreve com dois cifrões:
<?php
$campo = "cor";
$$campo = "azul";
echo $cor, "\n";
echo ${$campo}, "\n";
echo ${"cor"}, "\n";
$ php varvar.php azul azul azul
- $campo = "cor";
- Uma variável comum, que guarda o texto
"cor". - $$campo = "azul";
- O PHP lê de dentro para fora:
$campovale"cor", então$$campoé$cor. A linha cria a variável$corcom o valor"azul". - ${$campo} e ${"cor"}
- A mesma coisa, com chaves para deixar claro qual parte vira nome.
Variáveis variáveis deixam o código difícil de ler (de onde veio esse $cor?) e perigoso se o nome vier de um formulário. Quando você quiser guardar "vários valores com nomes", use um array associativo: $dados["cor"] = "azul"; (aula Arrays Associativos). Você vai encontrar $$ em código antigo; agora sabe o que é.
Quando dá errado
Warning: Undefined variable $...
$ php total.php Warning: Undefined variable $preco in /home/ana/site/total.php on line 2 Total: 1
O que significa: na linha indicada, você usou uma variável que ainda não tem valor. As causas mais comuns: nome digitado diferente ($preco × $preço × $Preco), variável criada mais abaixo no arquivo, ou criada dentro de um if que não foi executado.
Como consertar: copie o nome exato da mensagem e procure-o no arquivo. Confira se a variável recebe valor antes da linha do aviso. Se ela pode mesmo não existir, use isset ou ??.
Parse error: syntax error, unexpected token "echo"
$ cat f.php <?php $nome = "Ana" echo $nome; $ php f.php Parse error: syntax error, unexpected token "echo" in /home/ana/site/f.php on line 3
O que significa: faltou o ; no fim da linha 2. O PHP continuou lendo, achou o echo "no meio" da atribuição e reclamou na linha 3.
Como consertar: quando o erro aponta uma linha que parece certa, olhe o fim da linha anterior.
Parse error: syntax error, unexpected token "="
O que significa: o nome da variável é inválido (tem hífen, como $minha-variavel) ou falta o cifrão (nome = "Ana").
Como consertar: troque o hífen por sublinhado ou camelCase ($minha_variavel, $minhaVariavel) e confira o $.
<?php $nome = "Ana"; echo 'Olá, $nome' . "\n";
$ php aspas.php Olá, $nome
O que significa: entre aspas simples, o PHP não troca variáveis pelo valor.
Como consertar: use aspas duplas: echo "Olá, $nome\n";. A diferença entre os dois tipos de aspas está em Strings.
Referência rápida
| Escrita | O que faz | Exemplo |
|---|---|---|
$x = valor; | Cria a variável (ou troca o valor) | $nome = "Ana"; |
echo $x; | Mostra o valor | echo $nome, "\n"; |
"... $x ..." | Põe o valor no meio de um texto (só aspas duplas) | "Olá, $nome" |
$b = $a; | Copia o valor de $a para $b | $copia = $nome; |
var_dump($x); | Mostra tipo e valor | int(10) |
isset($x) | true se existe e não é null | isset($cupom) |
unset($x); | Apaga a variável | unset($cupom); |
$$x | Variável cujo nome é o valor de $x | $$campo |
Exercícios
1. Criar a variável
Complete para criar a variável cidade com o texto Recife:
2. Existe?
Complete para perguntar se a variável $email existe, sem provocar Warning:
3. Qual destes nomes de variável é válido?
4. O que este programa mostra? $a = 2; $b = $a; $a = 7; echo $b;
5. Depois de $x = null;, quanto vale isset($x)?
6. O programa tem $Total = 10; na linha 2 e echo $total; na linha 3. O que acontece?
Missão final: o recibo da lojinha
Missão: crie as variáveis $cliente (com "Bruno"), $produto (com "caderno") e $quantidade (com o número 3, sem aspas). Depois, mostre as três linhas abaixo usando as variáveis, sem digitar Bruno, caderno ou 3 dentro do texto:
Cliente: Bruno Produto: caderno Quantidade: 3
<?php // crie as três variáveis aqui // e mostre as três linhas aqui
<?php $cliente = "Bruno"; $produto = "caderno"; $quantidade = 3; echo "Cliente: $cliente\n"; echo "Produto: $produto\n"; echo "Quantidade: $quantidade\n";
Resumo
- Variável = caixa com nome (etiqueta) e valor. Em PHP, todo nome começa com
$. - Criar e mudar é a mesma coisa:
$nome = "Ana";. O=quer dizer "recebe", e o lado direito é calculado primeiro. - Nome:
$+ letra ou_+ letras, números,_. Sem hífen, sem espaço, sem começar com número. Use nomes que dizem o que guardam. $nomee$Nomesão variáveis diferentes.- Usar uma variável sem valor dá
Warning: Undefined variable, e o programa continua com um valor vazio. Nunca ignore. isset($x)pergunta se existe (e não énull);unset($x)apaga.$$xexiste, mas prefira arrays associativos.