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.
- 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_dumpdiz o tipo (string) e o tamanho (3). - "Ana"
- O conteúdo. O
var_dumpsempre 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:
- Troca as variáveis pelo valor.
"Olá, $nome"viraOlá, Ana. Isso se chama interpolação e tem aula própria: Interpolação (lá você vê{$...}, arrays e objetos dentro do texto). - 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
| Escreva | Para obter | Funciona em '…'? |
|---|---|---|
\n | Quebra de linha (new line) | Não |
\t | Tabulação (tab) | Não |
\" | Aspa dupla | Não (e nem precisa: '"' já funciona) |
\' | Aspa simples | Sim (dentro de "…" não precisa: "'") |
\\ | Uma barra invertida | Sim |
\$ | Um cifrão (sem virar variável) | Não (e nem precisa) |
\u{codigo} | Um caractere Unicode pelo código | Não |
\r | "Retorno de carro" (usado no fim de linha do Windows: \r\n) | Não |
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 valor | Não | Sim |
\n, \t, \u{…} | Não (ficam como texto) | Sim |
| Escapes que funcionam | só \' e \\ | todos da tabela acima |
| Bom para | Texto fixo; textos com $ ou \ que devem aparecer como estão; HTML com aspas duplas dentro | Textos 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:
| Forma | Exemplo | Saí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 aspas | veja 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.
| Letra | m | a | ç | ã | Total |
|---|---|---|---|---|---|
| Bytes | 1 | 1 | 2 | 2 | 6 |
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_.
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ção | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| Caractere | b | a | n | a | n | a |
| 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.
\n ou $nome literalmente na tela
O que significa: a string está entre aspas simples.
Como consertar: troque para aspas duplas: "Olá, $nome\n".
� 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
| Escrita | O que faz | Exemplo → 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 vazia | string(0) "" |
strlen($s) | Tamanho em bytes | strlen("maçã") → 6 |
mb_strlen($s) | Tamanho em letras | mb_strlen("maçã") → 4 |
$a . $b | Junta (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:
2. O primeiro caractere
Complete para mostrar a primeira letra de $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$variavelpelo valor e entendem\n,\t,\",\$,\\. - Aspa dentro de aspa: use o outro tipo por fora ou escape com
\. strlenconta 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, usemb_substr.