PHP Strings

Nome de cliente, endereço, mensagem de boas-vindas, o HTML inteiro de uma página: quase tudo o que um programa PHP mostra é texto. Em programação, texto se chama string. Nesta aula você aprende a escrever strings com aspas simples e duplas (e a diferença entre elas, que confunde muita gente), a colocar quebras de linha e aspas dentro do texto, a medir o tamanho de uma string e por que o PHP diz que "maçã" tem 6 caracteres.

Você vai aprender
  • O que é uma string e como escrevê-la com 'aspas simples' e "aspas duplas".
  • O que só as aspas duplas fazem: trocar variáveis pelo valor e entender \n, \t, \"…
  • Como colocar uma aspa dentro de uma string.
  • Como medir uma string com strlen, e o "problema" dos acentos.
  • Como juntar strings com o ponto (.).
  • Como pegar um caractere com $s[0], e por que isso quebra letras acentuadas.

Os programas desta aula rodaram com o PHP 8.5 na máquina fictícia da Ana, na pasta ~/site. As funções que transformam texto (maiúsculas, procurar, trocar, cortar) estão em Funções de String; aqui é a base.


A ideia: um colar de contas

A palavra inglesa string quer dizer "cordão". Pense num colar: cada conta é um caractere (uma letra, um número, um espaço, um ponto), e o cordão mantém as contas em ordem. "Ana" é um colar de 3 contas: A, n, a. "Olá, mundo!" é um colar mais comprido, com o espaço e a pontuação também contando como contas.

Para o PHP saber onde o texto começa e termina, você o coloca entre aspas. As aspas não fazem parte do texto: são o "fecho" do colar.


1. Criar uma string

Existem duas formas principais: aspas simples (') e aspas duplas ("). Para um texto simples, as duas dão o mesmo resultado:

<?php
$a = 'Ana';
$b = "Ana";
$vazia = "";
$texto = "Linha 1
Linha 2";
var_dump($a, $b, $vazia);
echo $texto, "\n";
$ php criar.php
string(3) "Ana"         « com aspas simples
string(3) "Ana"         « com aspas duplas: igualzinho
string(0) ""            « a string vazia: zero caracteres
Linha 1                 « a quebra de linha digitada no código faz parte do texto
Linha 2
string(3)
O var_dump diz o tipo (string) e o tamanho (3).
"Ana"
O conteúdo. O var_dump sempre mostra com aspas duplas, não importa como você escreveu.
""
A string vazia: existe, é do tipo string, mas não tem nenhum caractere. Útil como "ainda não preenchido".

Uma string pode ocupar várias linhas: o PHP guarda as quebras de linha que você digitou entre as aspas. Para textos longos, existe uma forma mais confortável, o heredoc.


2. Aspas simples: o texto é exatamente o que você escreveu

Entre aspas simples, o PHP não interpreta nada: $nome fica $nome, \n fica \n (uma barra e a letra n). Só existem duas exceções: \' (para escrever uma aspa simples) e \\ (para escrever uma barra).

<?php
$nome = "Ana";
echo 'Olá, $nome\n';
echo "\n";
echo 'It\'s ok', "\n";
echo 'Barra: \\ e \n e \t', "\n";
$ php simples.php
Olá, $nome\n            « nada foi trocado: nem a variável, nem o \n
It's ok                 « \' virou uma aspa simples
Barra: \ e \n e \t      « \\ virou uma barra; \n e \t ficaram como estão

Repare na linha 4 do programa: como 'Olá, $nome\n' não pulou linha, foi preciso um echo "\n"; separado (com aspas duplas) para a próxima frase não grudar.


3. Aspas duplas: variáveis e sequências de escape

Entre aspas duplas, o PHP faz duas coisas a mais:

  1. Troca as variáveis pelo valor. "Olá, $nome" vira Olá, Ana. Isso se chama interpolação e tem aula própria: Interpolação (lá você vê {$...}, arrays e objetos dentro do texto).
  2. Entende as sequências de escape: combinações que começam com barra invertida e representam um caractere especial, como a quebra de linha.
<?php
$nome = "Ana";
echo "Olá, $nome\n";
echo "Tab:\t[fim]\n";
echo "Ele disse \"oi\"\n";
echo "Custa \$5\n";
echo "Barra: \\ \n";
echo "Emoji: \u{1F600}\n";
$ php duplas.php
Olá, Ana                « $nome trocado, \n pulou a linha
Tab:	[fim]           « \t virou uma tabulação
Ele disse "oi"          « \" virou uma aspa dupla
Custa $5                « \$ virou um cifrão comum (sem procurar variável)
Barra: \                « \\ virou uma barra
Emoji: 😀               « \u{1F600} é o código Unicode do emoji

As sequências de escape mais usadas

EscrevaPara obterFunciona em '…'?
\nQuebra de linha (new line)Não
\tTabulação (tab)Não
\"Aspa duplaNão (e nem precisa: '"' já funciona)
\'Aspa simplesSim (dentro de "…" não precisa: "'")
\\Uma barra invertidaSim
\$Um cifrão (sem virar variável)Não (e nem precisa)
\u{codigo}Um caractere Unicode pelo códigoNão
\r"Retorno de carro" (usado no fim de linha do Windows: \r\n)Não
A barra antes de uma letra qualquer

Se a combinação não é uma sequência conhecida, a barra fica no texto. Mas cuidado com caminhos do Windows entre aspas duplas:

<?php
echo "C:\pasta\nova\n";
echo 'C:\pasta\nova', "\n";
$ php caminho.php
C:\pasta                « o \p não é especial e ficou; o \n de "\nova" pulou a linha!
ova
C:\pasta\nova           « com aspas simples, nada é especial

Missão: usando a variável $nome (sem digitar "Ana" no texto), mostre exatamente A Ana disse "oi" e pagou $5. Você vai precisar de duas sequências de escape. Dica: rode primeiro como está e leia o erro.

<?php
$nome = "Ana";
echo "A $nome disse "oi" e pagou $5\n";
<?php
$nome = "Ana";
echo "A $nome disse \"oi\" e pagou \$5\n";

Simples ou duplas: qual usar?

'aspas simples'"aspas duplas"
Troca $variavel pelo valorNãoSim
\n, \t, \u{…}Não (ficam como texto)Sim
Escapes que funcionamsó \' e \\todos da tabela acima
Bom paraTexto fixo; textos com $ ou \ que devem aparecer como estão; HTML com aspas duplas dentroTextos com variáveis ou com quebras de linha

Não existe diferença de velocidade que importe. Uma regra prática que muitos programadores PHP seguem: aspas simples por padrão; aspas duplas quando precisar de variável ou de \n. O importante é saber o que cada uma faz.


4. Uma aspa dentro da outra

A aspa que abriu a string também a fecha. Se o seu texto tem uma aspa do mesmo tipo, o PHP acha que o texto acabou ali:

$ cat erro-aspa.php
<?php
echo 'It's ok';
$ php erro-aspa.php

Parse error: syntax error, unexpected identifier "s", expecting "," or ";" in /home/ana/site/erro-aspa.php on line 2

O PHP leu 'It' como a string inteira e depois encontrou um s solto, que não faz sentido ali ("esperava , ou ;"). Há três saídas:

FormaExemploSaída
Usar o outro tipo de aspas por fora"It's ok", 'Ele disse "oi"'It's ok, Ele disse "oi"
Escapar a aspa com \'It\'s ok', "Ele disse \"oi\""as mesmas
Heredoc, para textos grandes com muitas aspasveja Heredoc e Nowdoc

A primeira é a mais legível. É por isso que, ao escrever HTML dentro do PHP, muita gente usa aspas simples por fora: echo '<a href="contato.php">Contato</a>';.


5. O tamanho de uma string: strlen

A função strlen (de string length, "comprimento da string") conta quantos caracteres… quer dizer, quantos bytes a string tem. Veja:

<?php
var_dump(strlen("Ana"));
var_dump(strlen("Olá, mundo!"));
var_dump(strlen(""));
var_dump(strlen("maçã"));
var_dump(mb_strlen("maçã"));
$ php tamanho.php
int(3)
int(12)                 « 11 caracteres na tela, mas 12 bytes: o "á" vale 2
int(0)
int(6)                  « "maçã" tem 4 letras, mas 6 bytes!
int(4)                  « mb_strlen conta letras de verdade

Por que "maçã" tem 6?

O computador guarda tudo como números de 0 a 255, os bytes. As letras sem acento (a–z, A–Z), os números e a pontuação comum cabem em 1 byte cada. Já ç, ã, é, os emojis e as letras de outros alfabetos não cabem: no padrão UTF-8 (o usado em praticamente toda página e arquivo hoje), eles ocupam de 2 a 4 bytes.

LetramaçãTotal
Bytes11226

As funções clássicas de string do PHP (strlen, substr, strtoupper, strrev…) são antigas: trabalham com bytes e não sabem que dois bytes juntos formam um "ç". Para o português, isso dá resultados estranhos:

<?php
echo strtoupper("maçã"), "\n";
echo mb_strtoupper("maçã"), "\n";
$ php acentos.php
MAçã                    « strtoupper não conhece ç e ã: deixou como estavam
MAÇÃ                    « a versão mb_ acerta

A solução é a família de funções mb_ (de multibyte, "vários bytes"): mb_strlen, mb_substr, mb_strtoupper… Elas contam e cortam letras, não bytes. Toda a história está em Acentos e mbstring. Por enquanto, a regra: texto que pode ter acento → funções mb_.

Quando strlen é o certo

Às vezes você quer mesmo os bytes: para saber o tamanho de um arquivo, de uma senha que vai para o banco de dados, ou de um campo com limite em bytes. Aí strlen é exato.


6. Juntar strings: o ponto (.)

Em PHP, o sinal para "colar" duas strings é o ponto, e não o + (que é só para números). Juntar strings se chama concatenar:

<?php
$nome = "Ana";
$sobrenome = "Souza";
$completo = $nome . " " . $sobrenome;
echo $completo, "\n";
echo "Tamanho: " . strlen($completo) . "\n";
$ php juntar.php
Ana Souza
Tamanho: 9

Repare no " " no meio: o ponto cola sem espaço, então o espaço entre nome e sobrenome precisa ser colado também. O operador ., o atalho .= e quando preferir ponto ou interpolação estão em Operadores de String.


7. Cada caractere: $s[0]

Uma string funciona como uma fileira de caixinhas numeradas, uma por byte, começando do zero. Você pega uma caixinha escrevendo o número entre colchetes. Números negativos contam do fim: -1 é o último.

Posição012345
Caracterebanana
Do fim-6-5-4-3-2-1
<?php
$s = "banana";
echo $s[0], " ", $s[1], " ", $s[-1], "\n";
$s[0] = "B";
echo $s, "\n";
echo $s[10];
echo "fim\n";
$ php posicao.php
b a a                   « posição 0, posição 1 e a última
Banana                  « dá para trocar um caractere

Warning: Uninitialized string offset 10 in /home/ana/site/posicao.php on line 6
fim

Uninitialized string offset 10 = "posição 10 da string não existe": "banana" só vai de 0 a 5. É um Warning: o programa continua, e o echo não mostra nada.

Por que "array de bytes" importa

Como cada caixinha é um byte, uma letra acentuada ocupa duas caixinhas. Pegar só uma delas dá meio caractere, que a tela não sabe desenhar:

<?php
$f = "maçã";
var_dump($f[2]);
var_dump($f[0] . $f[1] . $f[2]);
echo strrev("maçã"), "\n";
$ php meio.php
string(1) "�"           « o primeiro byte do "ç", sozinho: lixo
string(3) "ma�"         « "ma" + meio "ç"
�ç�am                   « strrev inverteu os bytes e embaralhou os acentos

O � é o "caractere de substituição": o terminal (ou o navegador) mostra isso quando recebe um pedaço de letra que não forma nada. Para pegar a terceira letra de uma palavra acentuada, use mb_substr($f, 2, 1) (veja Acentos e mbstring).

Experimente: troque a palavra por outras ("PHP", "pão", "café") e compare strlen com mb_strlen. Qual é a primeira e a última letra de cada uma?

<?php
$palavra = "abacaxi";
echo "Bytes: ", strlen($palavra), "\n";
echo "Letras: ", mb_strlen($palavra), "\n";
echo "Primeira: ", $palavra[0], "\n";
echo "Última: ", $palavra[-1], "\n";

Quando dá errado

Parse error: syntax error, unexpected identifier "s", expecting "," or ";"

O que significa: uma aspa dentro do texto fechou a string antes da hora ('It's ok'), e o resto virou código sem sentido. O nome citado ("s") é a primeira coisa depois da aspa.

Como consertar: use o outro tipo de aspas por fora ("It's ok") ou escape a aspa ('It\'s ok').

Parse error: syntax error, unexpected end of file
$ cat sem-fechar.php
<?php
$nome = "Ana;
echo $nome;
$ php sem-fechar.php

Parse error: syntax error, unexpected end of file in /home/ana/site/sem-fechar.php on line 4

O que significa: uma aspa abriu e nunca fechou. O PHP engoliu o resto do arquivo como texto e chegou ao fim (end of file) procurando a aspa. A linha da mensagem é a última do arquivo, não a do erro.

Como consertar: procure a aspa sem par. Num editor com cores (Editores e IDEs), o trecho depois dela inteiro fica com a cor de "texto", o que entrega o lugar.

Aparece \n ou $nome literalmente na tela

O que significa: a string está entre aspas simples.

Como consertar: troque para aspas duplas: "Olá, $nome\n".

Aparecem � ou ç no lugar dos acentos

O que significa: o � aparece quando um pedaço de letra foi cortado (por $s[2], substr, strrev…). Já o ç no lugar de ç é outro problema: a página foi lida com a codificação errada.

Como consertar: para textos com acento, use as funções mb_. Para páginas, salve os arquivos em UTF-8 e declare <meta charset="utf-8">. Tudo em Acentos e mbstring.

Warning: Uninitialized string offset

O que significa: você pediu uma posição além do fim da string (lembre: a última posição é o tamanho menos 1).

Como consertar: confira o tamanho com strlen antes, ou use $s[-1] para o último.


Referência rápida

EscritaO que fazExemplo → resultado
'texto'String literal (só \' e \\ são especiais)'Oi $x' → Oi $x
"texto"String com variáveis e escapes"Oi $x\n" → Oi Ana + quebra de linha
""String vaziastring(0) ""
strlen($s)Tamanho em bytesstrlen("maçã") → 6
mb_strlen($s)Tamanho em letrasmb_strlen("maçã") → 4
$a . $bJunta (concatena)"Ana" . "!" → Ana!
$s[0], $s[-1]Primeiro e último byte"banana"[-1] → a

Exercícios

1. Pular linha

Complete para o texto pular a linha no fim:

echo "Bom dia!";

2. O primeiro caractere

Complete para mostrar a primeira letra de $nome:

echo $nome[];

3. Com $nome = "Ana";, o que echo 'Oi, $nome'; mostra?

4. Quanto vale strlen("pão")?

5. Qual destas linhas mostra Ele disse "sim" sem erro?

Missão final: a etiqueta do produto

Missão: a Ana quer uma etiqueta para o produto da variável $produto. Mostre as duas linhas abaixo calculando os números com strlen($produto) e mb_strlen($produto) e a inicial com $produto[0] (não digite os números à mão):

Produto: pão de queijo (14 bytes, 13 letras)
Inicial: p
<?php
$produto = "pão de queijo";
<?php
$produto = "pão de queijo";
echo "Produto: $produto (" . strlen($produto) . " bytes, " . mb_strlen($produto) . " letras)\n";
echo "Inicial: " . $produto[0] . "\n";

Resumo

  • String = texto, entre aspas. "" é a string vazia.
  • Aspas simples: tudo literal (só \' e \\ funcionam). Aspas duplas: trocam $variavel pelo valor e entendem \n, \t, \", \$, \\.
  • Aspa dentro de aspa: use o outro tipo por fora ou escape com \.
  • strlen conta bytes; letras acentuadas valem 2. Para contar letras, mb_strlen.
  • O ponto junta strings: $nome . " " . $sobrenome.
  • $s[0] é o primeiro byte, $s[-1] o último. Com acentos, use mb_substr.