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.

Você vai aprender
  • 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 $nome e $Nome são variáveis diferentes.
  • O que significa Warning: Undefined variable e como evitá-lo.
  • Como perguntar "esta variável existe?" com isset e como apagar uma com unset.
  • 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 caixaNome técnicoExemplo
A etiquetanome da variável$nome, $preco
O que está guardado agoravalor"Ana", 4.5, 29
O tipo de coisa guardadatipotexto, 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ão 4,5. O PHP segue a escrita dos Estados Unidos. Para mostrar 4,50 ao usuário, existe o number_format (aula Formatar Números).
  • Dentro de aspas duplas, a variável é trocada pelo valor: "$nome tem $idade anos." virou Ana tem 29 anos.. Isso se chama interpolação e tem aula própria: Interpolação. A vírgula em echo $nome, "\n" só separa duas coisas que o echo vai 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
  1. $qtd = 3; → a caixa guarda 3.
  2. $qtd + 2 → o PHP lê o valor atual (3) e soma: 5.
  3. $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.

  1. Começa com $.
  2. Depois do cifrão, vem uma letra ou um sublinhado (_). Nunca um número.
  3. O resto pode ter letras, números e sublinhados. Sem espaços, sem hífen, sem pontuação.
  4. $this é reservado (ele aparece nas aulas de Classes e Objetos).
NomeVale?Por quê
$nomeSimSó letras.
$item2SimNúmeros podem vir depois da primeira letra.
$_totalSimPode começar com sublinhado.
$nome_completo, $nomeCompletoSimSublinhado ou maiúscula no meio separam as palavras.
$preçoSim, mas eviteO PHP aceita letras acentuadas, mas nem todo teclado e editor lida bem com elas. Use $preco.
$1nomeNãoComeça com número.
$minha-variavelNãoO hífen é o sinal de menos: o PHP lê "$minha menos variavel".
$minha variavelNãoO espaço corta o nome em dois.
nome (sem $)NãoSem o cifrão, não é variável.
$thisNãoReservado 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 $pt ou $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:

LinhaO que acontece
2Cria $nome (com n minúsculo).
3Procura $Nome (com N maiúsculo). Não existe: aviso Undefined variable $Nome, e o echo não mostra nada.
4ECHO em maiúsculas funciona, e $nome existe: aparece Ana.
Por que 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 error e Parse 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.

A linha em branco antes do Warning

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çãoisset($x)
$x nunca foi criadafalse (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: $campo vale "cor", então $$campo é $cor. A linha cria a variável $cor com o valor "azul".
${$campo} e ${"cor"}
A mesma coisa, com chaves para deixar claro qual parte vira nome.
Reconheça, mas quase nunca use

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

O programa roda, mas mostra o nome da variável em vez do valor
<?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

EscritaO que fazExemplo
$x = valor;Cria a variável (ou troca o valor)$nome = "Ana";
echo $x;Mostra o valorecho $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 valorint(10)
isset($x)true se existe e não é nullisset($cupom)
unset($x);Apaga a variávelunset($cupom);
$$xVariá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:

= "Recife";

2. Existe?

Complete para perguntar se a variável $email existe, sem provocar Warning:

var_dump(($email));

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.
  • $nome e $Nome sã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.
  • $$x existe, mas prefira arrays associativos.