PHP Operadores de String
O PHP tem só dois operadores de texto, e você vai usá-los em quase todo programa: o ponto ., que junta textos, e o .=, que acrescenta um texto no fim de uma variável. Parece simples, e é, mas há detalhes que pegam quem vem de outras linguagens: o + não junta texto, os espaços não aparecem sozinhos e números colados viram texto.
- Como juntar textos e variáveis com o ponto
.(a concatenação). - O que acontece quando você junta números,
true,falseenull. - Por que
"Ana" + "Bia"dá erro fatal no PHP. - Como montar um texto aos poucos com
.=. - Quando usar concatenação e quando usar interpolação (
"Olá, $nome").
Você já conhece textos (Strings) e variáveis (Variáveis). Para ver o tipo e o tamanho de cada resultado, usamos o var_dump.
A ideia: engatar vagões
Pense num trem de brinquedo. Cada vagão é um pedaço de texto: "Olá, ", "Ana", "!". O ponto . é o engate entre os vagões. Depois de engatados, eles viram um trem só: o texto "Olá, Ana!".
Juntar textos assim tem um nome técnico: concatenação (do latim catena, "corrente": ligar elos de uma corrente). O ponto é o operador de concatenação.
O ponto .
<?php $nome = "Ana"; echo "Olá, " . $nome . "!\n"; echo "Olá," . $nome . "\n"; $saudacao = "Bom dia, " . $nome . ". Tudo bem?"; echo $saudacao . "\n"; var_dump($saudacao);
$ php ponto.php Olá, Ana! Olá,Ana Bom dia, Ana. Tudo bem? string(23) "Bom dia, Ana. Tudo bem?"
- "Olá, "
- O primeiro vagão: um texto fixo. Repare no espaço depois da vírgula, dentro das aspas.
- .
- O engate: "junte o que está à esquerda com o que está à direita".
- $nome
- O segundo vagão: o valor da variável (
"Ana"). - . "!\n"
- Mais um engate e o último vagão: a exclamação e a quebra de linha.
Três coisas para notar na saída:
- O ponto não coloca espaço. Na segunda linha,
"Olá,"não terminava com espaço, e saiuOlá,Ana. Todo espaço que você quer ver precisa estar dentro das aspas. - Os espaços em volta do ponto não contam.
"Olá, " . $nomee"Olá, ".$nomedão o mesmo resultado. Os espaços fora das aspas servem só para você ler melhor (e são o estilo recomendado). - O resultado pode ser guardado.
$saudacaorecebeu o texto já pronto: um texto de 23 bytes, como mostra ovar_dump.
Em "Bom dia, " . $nome . ". Tudo bem?" há pontos de dois tipos. Os que estão fora das aspas são o operador. O que está dentro de ". Tudo bem?" é só um ponto final, parte do texto. Dentro das aspas, nada é operador.
Missão: rode e veja AnaSouza, tudo grudado. Conserte a linha do $completo para sair Nome completo: Ana Souza, juntando um espaço entre o nome e o sobrenome. Não escreva "Souza" à mão: use as variáveis.
<?php $nome = "Ana"; $sobrenome = "Souza"; $completo = $nome . $sobrenome; echo "Nome completo: " . $completo . "\n";
<?php $nome = "Ana"; $sobrenome = "Souza"; $completo = $nome . " " . $sobrenome; echo "Nome completo: " . $completo . "\n";
Juntando números e outros tipos
O ponto sempre dá um texto. Se um dos lados não for texto, o PHP o converte para texto antes de juntar:
<?php
var_dump(1 . 2);
var_dump(1.2);
var_dump("Idade: " . 29);
var_dump("Preço: " . 9.90);
var_dump("Total: " . 10 / 3);
var_dump("Ativo: " . true);
var_dump("Ativo: " . false);
var_dump("Nada: " . null);
$a = 1; $b = 2;
var_dump($a . $b);
var_dump($a + $b);
$ php numeros.php string(2) "12" float(1.2) string(9) "Idade: 29" string(11) "Preço: 9.9" string(22) "Total: 3.3333333333333" string(8) "Ativo: 1" string(7) "Ativo: " string(6) "Nada: " string(2) "12" int(3)
| Expressão | Resultado | Por quê |
|---|---|---|
1 . 2 | "12" | Os números viram os textos "1" e "2" e são colados. Não é uma soma. |
1.2 | 1.2 (float) | Sem espaços, o ponto é a casa decimal: é o número um vírgula dois. |
"Preço: " . 9.90 | "Preço: 9.9" | O número 9.90 é o mesmo que 9.9; o zero do fim some. Para mostrar dinheiro, use number_format. |
"Total: " . 10 / 3 | "Total: 3.3333333333333" | A divisão é feita antes (veja Precedência), depois o resultado vira texto. |
"Ativo: " . true | "Ativo: 1" | true vira "1". |
"Ativo: " . false | "Ativo: " | false vira texto vazio: não aparece nada. |
"Nada: " . null | "Nada: " | null também vira texto vazio. |
$a . $b × $a + $b | "12" × 3 | O ponto cola; o + soma. O operador decide o que acontece, não o tipo das variáveis. |
1 . 2 precisa dos espaços
Sem espaços, 1.2 é um número decimal. E echo 1. 2; (espaço só depois do ponto) é um erro: o PHP lê 1. como o número 1.0 e depois não sabe o que fazer com o 2:
$ php umdois.php Parse error: syntax error, unexpected integer "2", expecting "," or ";" in /home/ana/site/umdois.php on line 2
Com variáveis isso não acontece ($a.$b funciona), mas o costume de colocar um espaço de cada lado do ponto evita a confusão.
O + não junta texto
Em linguagens como JavaScript e Java, "Olá, " + nome junta textos. No PHP, não. O + é sempre uma soma. Se os textos parecem números, ele soma os números; se não parecem, o programa para com um erro:
<?php
var_dump("10" + "5");
var_dump("10" . "5");
var_dump("Ana" + "Bia");
$ php mais.php
int(15)
string(3) "105"
Fatal error: Uncaught TypeError: Unsupported operand types: string + string in /home/ana/site/mais.php:4
Stack trace:
#0 {main}
thrown in /home/ana/site/mais.php on line 4
- "10" + "5" → int(15)
- Os dois textos contêm números, então o
+converte e soma: o resultado é o número 15. - "10" . "5" → "105"
- O ponto junta: o texto
"105". - "Ana" + "Bia" → Fatal error
- Unsupported operand types: string + string = "tipos de operando não suportados: texto + texto". Não existe soma de nomes; o programa para.
Lembre: no PHP, texto se junta com ponto. O + é para contas.
O .=: acrescentar no fim
Muitas vezes você monta um texto aos poucos: uma lista, um recibo, uma página. O .= (ponto e igual) pega o que já está na variável e acrescenta mais um pedaço no fim. É uma atribuição combinada, como o +=:
<?php $lista = "Lista de compras:\n"; $lista .= "- arroz\n"; $lista .= "- feijão\n"; $lista .= "- café\n"; echo $lista;
$ php lista.php Lista de compras: - arroz - feijão - café
- $lista = "Lista de compras:\n";
- Cria a variável com o primeiro pedaço (o título).
- $lista .= "- arroz\n";
- Atalho de
$lista = $lista . "- arroz\n";: pega o texto antigo, junta o novo no fim e guarda de volta. - echo $lista;
- Mostra o texto completo, montado em quatro passos.
Do lado direito do .= pode vir qualquer expressão, inclusive outras concatenações:
<?php $cliente = "Ana"; $produto = "caderno"; $preco = 15; $quantidade = 3; $recibo = "Cliente: " . $cliente . "\n"; $recibo .= "Produto: " . $produto . "\n"; $recibo .= "Total: R$ " . $preco * $quantidade . "\n"; echo $recibo;
$ php recibo.php Cliente: Ana Produto: caderno Total: R$ 45
Na última linha, a multiplicação é feita antes de juntar, porque * tem prioridade maior que o ponto. Funciona, mas "Total: R$ " . ($preco * $quantidade) deixa a intenção mais clara (veja Precedência).
.=
O .= precisa ler o valor antigo. Se a variável ainda não existe, o PHP avisa (e depois continua, tratando o valor antigo como vazio):
$ php lista-erro.php Warning: Undefined variable $texto in /home/ana/site/lista-erro.php on line 2 primeira linha
A solução é começar com $texto = ""; (texto vazio) ou com um = no primeiro pedaço.
Concatenação × interpolação
Existe outra forma de colocar variáveis num texto: escrever a variável dentro das aspas duplas. O PHP troca a variável pelo valor. Isso se chama interpolação e tem uma aula só para ela: Interpolação. Aqui vai a comparação:
<?php $nome = "Ana"; $idade = 29; echo "Olá, " . $nome . "! Você tem " . $idade . " anos.\n"; echo "Olá, $nome! Você tem $idade anos.\n"; echo 'Olá, $nome!' . "\n"; $preco = 12.5; $qtd = 2; echo "Total: $preco * $qtd\n"; echo "Total: " . $preco * $qtd . "\n"; echo "Nome: " . strtoupper($nome) . "\n"; echo "Nome: strtoupper($nome)\n";
$ php interp.php Olá, Ana! Você tem 29 anos. Olá, Ana! Você tem 29 anos. Olá, $nome! Total: 12.5 * 2 Total: 25 Nome: ANA Nome: strtoupper(Ana)
- Linhas 1 e 2 da saída
- Concatenação e interpolação dão o mesmo texto. A interpolação é mais curta e fácil de ler quando são só variáveis.
- 'Olá, $nome!'
- Com aspas simples, não há interpolação: o
$nomeaparece como está. Para usar uma variável com aspas simples, só concatenando. - "Total: $preco * $qtd"
- A interpolação troca as variáveis, mas não faz contas: o
*ficou como texto. - "Nome: strtoupper($nome)"
- Também não chama funções: o nome da função saiu como texto. Para contas e funções, use concatenação.
Qual usar?
| Situação | Melhor forma | Exemplo |
|---|---|---|
| Texto com algumas variáveis | Interpolação | "Olá, $nome! Você tem $idade anos." |
| Resultado de uma conta | Concatenação | "Total: " . ($preco * $qtd) |
| Resultado de uma função | Concatenação | "Nome: " . strtoupper($nome) |
| Texto entre aspas simples | Concatenação | 'Preço: ' . $preco |
| Montar um texto aos poucos | .= | $html .= "<li>$item</li>"; |
| Muitos valores com formato (casas decimais, alinhamento) | sprintf | veja printf e sprintf |
Não existe forma "errada": as duas produzem o mesmo texto. Escolha a que deixa a linha mais fácil de ler. E as duas podem ser misturadas: "Olá, $nome! Total: " . ($preco * $qtd).
E a vírgula do echo?
Você já viu echo "Olá, ", $nome, "!\n"; na aula echo e print. As vírgulas não são concatenação: o echo recebe vários valores e mostra um depois do outro. Na tela, o resultado é igual:
<?php $nome = "Ana"; echo "Olá, ", $nome, "!\n"; echo "Olá, " . $nome . "!\n"; $frase = "Olá, " . $nome . "!"; echo $frase, "\n";
$ php virgula.php Olá, Ana! Olá, Ana! Olá, Ana!
A diferença: a vírgula só funciona no echo. Para guardar o texto numa variável ($frase), ou entregar a uma função, você precisa do ponto. $frase = "Olá, ", $nome; dá Parse error: syntax error, unexpected token ",".
Laboratório livre: compare as formas. Troque pontos por +, aspas duplas por simples, tire os espaços de dentro das aspas, e veja o que muda.
<?php
$nome = "Ana";
$cidade = "Recife";
$idade = 29;
echo "Concatenação: " . $nome . " mora em " . $cidade . "\n";
echo "Interpolação: $nome mora em $cidade\n";
echo "Daqui a 1 ano: " . ($idade + 1) . " anos\n";
var_dump(1 . 2);
var_dump("10" + "5");
$perfil = "Perfil\n";
$perfil .= "Nome: $nome\n";
$perfil .= "Cidade: $cidade\n";
echo $perfil;
Quando dá errado
$ php mais2.php
Fatal error: Uncaught TypeError: Unsupported operand types: string + string in /home/ana/site/mais2.php:3
Stack trace:
#0 {main}
thrown in /home/ana/site/mais2.php on line 3
O que aconteceu: a linha 3 era echo "Olá, " + $nome;. O + tentou somar dois textos que não são números.
Como resolver: troque o + por ponto: echo "Olá, " . $nome;.
$ php semponto.php Parse error: syntax error, unexpected variable "$nome", expecting "," or ";" in /home/ana/site/semponto.php on line 3
O que aconteceu: a linha era echo "Olá, " $nome;. Faltou o ponto entre o texto e a variável. O PHP esperava uma vírgula ou o fim da instrução (;) e encontrou uma variável.
Como resolver: coloque o engate: echo "Olá, " . $nome;. Esse é o erro mais comum de concatenação; quando a mensagem diz unexpected logo depois de um texto, procure o ponto que falta.
$ php array.php Warning: Array to string conversion in /home/ana/site/array.php on line 3 Lista: Array
O que aconteceu: o código era "Lista: " . $compras, e $compras é um array, uma lista com vários valores. O PHP não sabe transformar uma lista inteira em texto: mostra a palavra Array e avisa.
Como resolver: junte os itens do array com implode, por exemplo "Lista: " . implode(", ", $compras) (veja Funções de Array), ou mostre um item: $compras[0].
$ php nomecompleto.php Nome completo: AnaSouza
O que aconteceu: não é erro do PHP: o ponto não coloca espaço. O texto saiu exatamente como foi pedido.
Como resolver: junte um espaço: $nome . " " . $sobrenome, ou coloque o espaço dentro de um dos textos.
$ php numeros.php string(2) "12"
O que aconteceu: $a . $b com 1 e 2 dá "12". Era para ser +.
Como resolver: use + para somar. Se a soma estiver no meio de um texto, coloque-a entre parênteses: "Soma: " . ($a + $b).
Referência
| Operador | Nome | Exemplo | Resultado |
|---|---|---|---|
. | Concatenação | "Olá, " . "Ana" | "Olá, Ana" |
.= | Atribuição com concatenação | $t = "a"; $t .= "b"; | $t vale "ab" |
Valor juntado com . | Vira o texto |
|---|---|
29 | "29" |
9.90 | "9.9" |
true | "1" |
false | "" (vazio) |
null | "" (vazio) |
| um array | "Array" + Warning: Array to string conversion |
Exercícios
1. O engate
Complete com o operador que junta o texto e a variável:
2. Acrescentar no fim
Complete para acrescentar "- leite\n" no fim da variável $lista:
3. O espaço
Complete para o resultado ser "Ana Souza":
4. O que var_dump(1 . 2); mostra?
5. O que acontece com echo "Olá, " + "Ana"; no PHP 8.5?
6. $preco = 10; $qtd = 3; Qual linha mostra Total: 30?
Missão final: a nota da lojinha
Missão: monte a nota com .=. (1) Acrescente uma linha para cada item, no formato pão: R$ 8, usando as variáveis. (2) Acrescente a linha Total: R$ 13, calculando o total com $preco1 + $preco2.
<?php $item1 = "pão"; $preco1 = 8; $item2 = "leite"; $preco2 = 5; $nota = "NOTA DA LOJINHA\n"; // 1. Acrescente uma linha para cada item, no formato "pão: R$ 8" // 2. Acrescente a linha do total: "Total: R$ 13" echo $nota;
<?php $item1 = "pão"; $preco1 = 8; $item2 = "leite"; $preco2 = 5; $nota = "NOTA DA LOJINHA\n"; // 1. Acrescente uma linha para cada item, no formato "pão: R$ 8" $nota .= $item1 . ": R$ " . $preco1 . "\n"; $nota .= $item2 . ": R$ " . $preco2 . "\n"; // 2. Acrescente a linha do total: "Total: R$ 13" $nota .= "Total: R$ " . ($preco1 + $preco2) . "\n"; echo $nota;
Resumo
- O ponto
.junta (concatena) textos. Ele não coloca espaço: o espaço vai dentro das aspas. - O resultado do ponto é sempre um texto:
1 . 2dá"12",truevira"1",falseenullviram vazio. 1.2sem espaços é um número decimal. Escreva1 . 2com espaços.- No PHP,
+é sempre soma:"Ana" + "Bia"é um erro fatal. $t .= "x"acrescenta no fim; é o mesmo que$t = $t . "x". Crie a variável antes.- Interpolação (
"Olá, $nome") é mais curta para variáveis; concatenação é necessária para contas, funções e aspas simples.