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.

Você vai aprender
  • Como juntar textos e variáveis com o ponto . (a concatenação).
  • O que acontece quando você junta números, true, false e null.
  • 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:

  1. O ponto não coloca espaço. Na segunda linha, "Olá," não terminava com espaço, e saiu Olá,Ana. Todo espaço que você quer ver precisa estar dentro das aspas.
  2. Os espaços em volta do ponto não contam. "Olá, " . $nome e "Olá, ".$nome dão o mesmo resultado. Os espaços fora das aspas servem só para você ler melhor (e são o estilo recomendado).
  3. O resultado pode ser guardado. $saudacao recebeu o texto já pronto: um texto de 23 bytes, como mostra o var_dump.
E os pontos dentro das aspas?

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ãoResultadoPor quê
1 . 2"12"Os números viram os textos "1" e "2" e são colados. Não é uma soma.
1.21.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" × 3O 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).

Crie a variável antes do primeiro .=

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 $nome aparece 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çãoMelhor formaExemplo
Texto com algumas variáveisInterpolação"Olá, $nome! Você tem $idade anos."
Resultado de uma contaConcatenação"Total: " . ($preco * $qtd)
Resultado de uma funçãoConcatenação"Nome: " . strtoupper($nome)
Texto entre aspas simplesConcatenação'Preço: ' . $preco
Montar um texto aos poucos.=$html .= "<li>$item</li>";
Muitos valores com formato (casas decimais, alinhamento)sprintfveja 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

Fatal error: Uncaught TypeError: Unsupported operand types: string + string
$ 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;.

Parse error: syntax error, unexpected variable "$nome", expecting "," or ";"
$ 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.

Warning: Array to string conversion
$ 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].

As palavras saem grudadas
$ 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.

O número saiu "colado" em vez de somado
$ 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

OperadorNomeExemploResultado
.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:

echo "Olá, " $nome;

2. Acrescentar no fim

Complete para acrescentar "- leite\n" no fim da variável $lista:

$lista "- leite\n";

3. O espaço

Complete para o resultado ser "Ana Souza":

$completo = $nome . . $sobrenome;

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 . 2 dá "12", true vira "1", false e null viram vazio.
  • 1.2 sem espaços é um número decimal. Escreva 1 . 2 com 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.