Strings
Uma string é uma série de caracteres, onde um caractere é
o mesmo que um byte. Isso significa que o PHP possui suporte a um conjunto de apenas 256 caracteres,
e, portanto, não possui suporte nativo a Unicode. Veja mais
detalhes do tipo
string.
Nota:
A partir do PHP 7.0.0, não há restrições particulares em relação ao tamanho de uma
uma string em compilações de 64 bits. Em compilações de 32 bits e em
versões anteriores, uma
string pode ter o tamanho de até 2GB (máximo de 2147483647 bytes)
Sintaxe
Uma string literal pode ser especificada de quatro formas diferentes.
Aspas simples
A maneira mais simples de se especificar uma string é
delimitá-la entre aspas simples (o caractere '
).
Para especificar um apóstrofo, escape-o com uma contrabarra
(\
). Para especificar uma contrabarra literal, dobre-a
(\\
). Todas as outras ocorrências da contrabarra serão tratadas
como uma contrabarra literal: isso significa que outras sequências de escape que
se esteja acostumado a utilizar, como \r
ou \n
, serão
literalmente impressas em vez de ter qualquer significado
especial.
Nota:
Diferentemente das sintaxes com aspas duplas
e heredoc,
variáveis e sequências de escape
para caracteres especiais não serão expandidas quando ocorrerem
dentro de uma string delimitada por aspas simples.
Aspas duplas
Se a string for delimitada entre aspas duplas ("), o PHP
interpretará a seguinte sequência de escape como caracteres especiais:
Sequências de escape
Sequências |
Significado |
\n |
fim de linha (LF ou 0x0A (10) em ASCII) |
\r |
retorno de carro (CR ou 0x0D (13) em ASCII) |
\t |
TAB horizontal (HT ou 0x09 (9) em ASCII) |
\v |
TAB vertical (VT ou 0x0B (11) em ASCII) (a partir do PHP 5.2.5) |
\e |
escape (ESC or 0x1B (27) em ASCII) (a partir do PHP 5.4.4) |
\f |
form feed (FF ou 0x0C (12) em ASCII) (a partir do PHP 5.2.5) |
\\ |
contrabarra ou barra invertida |
\$ |
sinal de cifrão |
\" |
aspas duplas |
\[0-7]{1,3} |
a sequência de caracteres correspondente a expressão regular é um
caractere em notação octal, que silenciosamente é extravasada para caber em um byte
(e.g. "\400" === "\000")
|
\x[0-9A-Fa-f]{1,2} |
a sequência de caracteres correspondente a expressão regular é um
caractere em notação hexadecimal
|
\u{[0-9A-Fa-f]+} |
a sequência de caracteres correspondente a expressão regular é um
código Unicode, que será impresso como uma string que representa um código
UTF-8 (adicionado no PHP 7.0.0)
|
Como com as strings entre aspas simples, escapar qualquer outro caractere
resultará em uma contrabarra sendo impressa. Em versões anteriores ao PHP 5.1.1, a contrabarra em
\{$var}
não era impressa.
O recurso mais importante de strings delimitadas por aspas duplas é o fato de que
nomes de variáveis serão expandidos. Veja
interpretação de strings para
detalhes.
Heredoc
Uma terceira maneira de delimitar strings é a sintaxe heredoc:
<<<
. Após este operador, um identificador é
fornecido seguido de uma nova linha. A própria string é colocada em seguida e a seguir
o mesmo identificador novamente para fechar a string.
O identificador de fechamento precisa começar na primeira
coluna da linha. Além disso, o identificador precisa seguir as mesmas regras de nomeação
como qualquer outro rótulo no PHP: deve conter somente caracteres alfanuméricos e
sublinhados, e precisa começar com um caractere não numérico ou sublinhado.
Aviso
É muito importante notar que a linha que contêm o identificador de fechamento não
deve conter nenhum outro caractere, com exceção do ponto-e-vírgula (;
).
Isso significa que o identificador
não deve ser indentado e não deve ter nenhum espaço
ou tabulações antes ou depois do ponto-e-vírgula. Também é importante perceber que
o primeiro caractere antes do identificador de fechamento deve ser uma nova linha como
definido pelo sistema operacional local. Isso é, \n
em
sistemas UNIX, incluindo o MAC OS X. O identificador de fechamento também deve ser
seguido por uma nova linha.
Se essa regra for quebrada e o identificador de fechamento não estiver "limpo", ele
não será considerado um identificador de fechamento, e o PHP continuará procurando por
um. Se um identificador de fechamento apropriado não for encontrado antes do final do
arquivo atual, um erro de interpretação será lançado na última linha.
Exemplo #1 Exemplo inválido
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
// O identifcador não deve ser indentado
?>
Exemplo #2 Exemplo válido
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
Heredocs não podem ser usados para inicializar propriedades de classe. A partir do php 5.3,
esta limitação é válida apenas para heredocs contendo variáveis.
Textos heredoc se comportam como strings delimitadas por aspas duplas, sem
as aspas duplas. Isso significa que aspas simples em heredocs não precisam ser
escapadas, apesar de que os códigos de escape listados acima podem continuar sendo utilizados. Variáveis
são expandidas, mas o mesmo cuidado deve ser tomado ao expressar variáveis complexas
dentro do heredoc assim como nas strings.
Exemplo #3 Exemplo de delimitação de strings heredoc
<?php
$str = <<<EOD
Exemplo de uma string
distribuída em várias linhas
utilizando a sintaxe heredoc.
EOD;
/* Exemplo mais complexo, com variáveis */
class foo
{
var $foo;
var $bar;
function foo()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'Meu nome';
echo <<<EOT
Meu nome é "$name". Eu estou imprimindo $foo->foo.
Agora, eu estou imprimindo {$foo->bar[1]}.
Isto deve imprimir um 'A' maiúsculo: \x41
EOT;
?>
O exemplo acima irá imprimir:
My name is "MyName". I am printing some Foo.
Now, I am printing some Bar2.
This should print a capital 'A': A
É possível também utilizar a sintaxe Heredoc para passar dados para argumentos de
funções:
Exemplo #4 Exemplo de Heredoc em argumentos
<?php
var_dump(array(<<<EOD
foobar!
EOD
));
?>
A partir do PHP 5.3.0, é possível inicializar variáveis estáticas e
propriedades/constantes de classe utilizando a sintaxe heredoc:
Exemplo #5 Utilizando o Heredoc na inicialização de valores estáticos
<?php
// Variáveis estáticas
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// Classe propriedades/constantes
class foo
{
const BAR = <<<FOOBAR
Constant example
FOOBAR;
public $baz = <<<FOOBAR
Property example
FOOBAR;
}
?>
A partir do PHP 5.3.0, o identificador de abertura do Heredoc pode ser opcionalmente
delimitado por aspas duplas:
Exemplo #6 Usando aspas duplas no Heredoc
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
Nowdoc
Nowdocs estão para aspas simples assim como os heredocs estão para aspas duplas em
strings. Um nowdoc é especificado similarmente a um heredoc, mas
nenhuma interpretação é feita dentro de um nowdoc. A construção é ideal para
colocar códigos PHP ou outros grandes blocos de texto sem a necessidade de
usar escapes. Compartilha algumas características em comum com a construção SGML
<![CDATA[ ]]>
, assim é declarado um bloco de
texto onde nada será analisado.
Um nowdoc é identificado com a mesma sequência <<<
usada para heredocs, mas o identificador precisa ficar entre
aspas simples, por exemplo. <<<'EOT'
. Todas as regras para
identificadores heredoc também se aplicam para identificadores nowdoc, especialmente aquelas
referentes a aparência do identificador de fechamento.
Exemplo #7 Exemplo de string em Nowdoc
<?php
echo <<<'EOD'
Example of string spanning multiple lines
using nowdoc syntax. Backslashes are always treated literally,
e.g. \\ and \'.
EOD;
O exemplo acima irá imprimir:
Example of string spanning multiple lines
using nowdoc syntax. Backslashes are always treated literally,
e.g. \\ and \'.
Exemplo #8 Exemplo de Nowdoc, com variáveis
<?php
class foo
{
public $foo;
public $bar;
function __construct()
{
$this->foo = 'Foo';
$this->bar = array('Bar1', 'Bar2', 'Bar3');
}
}
$foo = new foo();
$name = 'MyName';
echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;
?>
O exemplo acima irá imprimir:
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
Exemplo #9 Exemplo de dado estático
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Nota:
Suporte a Nowdoc foi adicionado no PHP 5.3.0.
Interpretação de variáveis
Quando uma string é especificada dentro de aspas duplas ou heredoc,
as variáveis são interpretadas dentro delas.
Há dois tipos de sintaxe: uma
simples e uma
complexa.
A sintaxe simples é a mais comum e conveniente. Provê uma maneira de
interpretar uma variável, o valor de um array ou uma propriedade de objeto
em uma string com o mínimo de esforço.
A sintaxe complexa pode ser reconhecida
pelas chaves envolvendo a expressão.
Sintaxe simples
Se um sinal de cifrão ($
) for encontrado, o interpretador tentará
obter tantos identificadores quantos forem possíveis para formar um nome de variável válido.
Envolva o nome da variável com chaves para especificar explicitamente o fim do
nome.
Similarmente, um índice de array ou uma propriedade de um objeto
podem ser interpretados. Com índices de arrays, o fechamento de colchetes
(]
) marca o final do índice. A mesma regra aplica-se a
propriedade de objetos, assim como para variáveis simples.
Exemplo #10 Exemplo com sintaxe simples
<?php
$juices = array("apple", "orange", "koolaid1" => "purple");
echo "He drank some $juices[0] juice.".PHP_EOL;
echo "He drank some $juices[1] juice.".PHP_EOL;
echo "He drank some $juices[koolaid1] juice.".PHP_EOL;
class people {
public $john = "John Smith";
public $jane = "Jane Smith";
public $robert = "Robert Paulsen";
public $smith = "Smith";
}
$people = new people();
echo "$people->john drank some $juices[0] juice.".PHP_EOL;
echo "$people->john then said hello to $people->jane.".PHP_EOL;
echo "$people->john's wife greeted $people->robert.".PHP_EOL;
echo "$people->robert greeted the two $people->smiths."; // Won't work
?>
O exemplo acima irá imprimir:
He drank some apple juice.
He drank some orange juice.
He drank some purple juice.
John Smith drank some apple juice.
John Smith then said hello to Jane Smith.
John Smith's wife greeted Robert Paulsen.
Robert Paulsen greeted the two .
A partir do PHP 7.1.0 índices numéricos negativos são
suportados.
Exemplo #11 Índices numéricos negativos
<?php
$string = 'string';
echo "The character at index -2 is $string[-2].", PHP_EOL;
$string[-3] = 'o';
echo "Changing the character at index -3 to o gives $string.", PHP_EOL;
?>
O exemplo acima irá imprimir:
The character at index -2 is n.
Changing the character at index -3 to o gives strong.
Para qualquer coisa mais complexa, utilize a sintaxe complexa.
Sintaxe complexa (chaves)
Isto não é chamado sintaxe complexa porque a sintaxe é complexa,
mas sim porque permite a utilização de expressões complexas.
Qualquer variável escalar, elemento de um array ou propriedade de um objeto com uma representação de uma
string pode ser incluída com essa sintaxe.
Simplesmente escreva a expressão da mesma forma como apareceria fora da
string e então coloque-o entre {
e
}
. Já que que {
não pode escapado, esta
sintaxe será somente reconhecida quando o $
seguir,
imediatamente, o {
. Use {\$
para obter um literal
{$
. Alguns exemplos que tornam isto claro:
Também é possível acessar propriedades de classes usando variáveis
que contêm strings utilizando esta sintaxe.
Nota:
Funções, chamadas a métodos, variáveis estáticas de classe e constantes de
classe dentro de {$}
funcionam a partir do PHP
5. Entretanto, o valor acessado deverá ser interpretado como o nome
de uma variável no escopo em que a string está definida. Utilizar
somente chaves ({}
) não funcionará
para acessar os valores de retorno de funções ou métodos nem os
valores de constantes da classe ou variáveis estáticas da classe.
Acesso e modificação da string por caractere
É possível acessar e modificar caracteres dentro de strings
especificando a posição, baseada em zero, do caractere desejado na
string usando colchetes, parecido com arrays, por exemplo
$str[42]. Imagine uma string como um
array de caracteres. As funções
substr() e substr_replace(),
podem ser utilizadas quando se deseja extrair ou substituir mais que 1 caractere.
Nota:
A partir do PHP 7.1.0, posições negativas para strings são suportadas. Estas especificam
a posição do final da string.
Antes, posições negativas emitiam um E_NOTICE
para leitura
(gerando um string vazia) e um E_WARNING
para escrita
(deixando a string intocada).
Nota:
Strings também podem ser acessadas usando colchetes, como em
$str{42}, com o mesmo propósito.
Aviso
Escrever em uma posição fora do intervalo preenche a string com espaços.
Tipos diferentes de inteiro são convertidos para inteiro.
Tipo ilegal de deslocamento emite um E_WARNING
.
Apenas o primeiro caractere de uma string atribuída é usado.
A partir de PHP 7.1.0, a atribuição de uma string vazia lança um erro fatal. Antes,
era atribuído o byte NULL.
Aviso
Internamente, as strings do PHP são arrays de bytes. Como resultado, acessar ou
modificar uma string usando colchetes não é seguro com multi-bytes e
deve ser feito somente em strings que utilizem apenas um byte em sua codificação,
como a ISO-8859-1.
Nota:
A partir do PHP 7.1.0, aplicar um operador de índice vazio em uma string lança um erro fatal
Antes, a string vazia era convertida em um array.
Exemplo #12 Alguns exemplos com strings
<?php
// Get the first character of a string
$str = 'This is a test.';
$first = $str[0];
// Get the third character of a string
$third = $str[2];
// Get the last character of a string.
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
// Modify the last character of a string
$str = 'Look at the sea';
$str[strlen($str)-1] = 'e';
?>
A partir do PHP 5.4 o deslocamento de strings devem ser inteiros ou strings equivalentes a inteiros, caso contrário um erro do tipo warning
será disparado. Anteriormente um deslocamento como "foo"
era silenciosamente convertido em 0
.
Exemplo #13 Diferenças entre o PHP 5.3 e PHP 5.4
<?php
$str = 'abc';
var_dump($str['1']);
var_dump(isset($str['1']));
var_dump($str['1.0']);
var_dump(isset($str['1.0']));
var_dump($str['x']);
var_dump(isset($str['x']));
var_dump($str['1x']);
var_dump(isset($str['1x']));
?>
O exemplo acima irá imprimir no PHP 5.3:
string(1) "b"
bool(true)
string(1) "b"
bool(true)
string(1) "a"
bool(true)
string(1) "b"
bool(true)
O exemplo acima irá imprimir no PHP 5.4:
string(1) "b"
bool(true)
Warning: Illegal string offset '1.0' in /tmp/t.php on line 7
string(1) "b"
bool(false)
Warning: Illegal string offset 'x' in /tmp/t.php on line 9
string(1) "a"
bool(false)
string(1) "b"
bool(false)
Nota:
Acessar variáveis de outros tipos (excluindo-se arrays ou objetos que
implementem certas interfaces) usando []
ou
{}
silenciosamente retornará null
.
Nota:
O PHP 5.5 adicionou o suporte ao acesso de caracteres dentro de strings literais
utilizando []
or {}
.
Conversão em strings
Um valor pode ser convertido em uma string utilizando o modificador
(string)
ou a função strval().
A conversão em string é automaticamente realizada no escopo de uma
expressão onde uma string é necessária. Isto acontece no uso das funções
echo ou print ou quando
o valor de uma variável é comparado com uma string. As seções Tipos e Conversão de Tipos tornarão
um pouco mais claro o assunto. Veja também a função settype().
O valor boolean true
é convertido para a string
"1"
. O boolean false
é convertido para
""
(uma string vazia). Isso permite converter nos dois
sentidos entre os valores booleano e string.
Um integer ou um float é convertido para uma
string representando o número textualmente (incluindo a parte
do expoente nos floats). Números de ponto flutuante podem ser
convertidos usando a notação exponencial (4.1E+6
).
Nota:
O caractere de ponto decimal é definido no código de idioma (locale) do script (categoria
LC_NUMERIC). Veja a função setlocale().
Arrays são sempre convertidos para uma string
"Array"
; por isso echo e
print não podem, por si só, mostrar o conteúdo de um
array. Para visualizar um único elemento, use uma construção como
echo $arr['foo']
. Veja abaixo dicas de como visualizar todo seu
conteúdo.
Para converter objetos em strings o método
mágico __toString deve ser usado.
Resources são sempre convertidos para strings na
estrutura "Resource id #1"
onde 1
é
o número único do resource atribuído pelo PHP
em tempo de execução. Apesar de que a estrutura exata desta string não seja confiável
e esteja sujeita a modificações, será sempre única a um dado recurso
dentro do ciclo de vida de um script sendo executado (por exemplo numa requisição Web ou em um processo
CLI) e não será reutilizada. Para obter o tipo de um recurso, utilize
a função get_resource_type().
null
é sempre convertido para uma string vazia.
Como declarado acima, converter diretamente um array,
objeto ou recurso para uma string não
fornece nenhuma informação útil sobre o valor, a não ser seu tipo. Veja as
funções print_r() e var_dump()
para maneiras mais efetivas de inspecionar o conteúdo destes tipos.
A maioria dos valores no PHP também podem ser convertidos em strings para armazenamento
permanente. Este método é chamado de serialização e pode ser feito com a função
serialize().
Conversão de strings para números
Quando uma string é interpretada como um valor numérico, o valor
resultante e seu tipo é determinado como segue.
Se a string não conter nenhum dos caracteres '.', 'e',
ou 'E' e o valor numérico encaixa-se dentro dos limites do tipo inteiro (definido pela constante
PHP_INT_MAX
), a string será avaliada
como um inteiro. Em todos os outros casos será interpretada como um
float.
O valor é obtido da porção inicial da string. Se a
string começar com dados numéricos válidos, esse será o valor
utilizado. Caso contrário, o valor será 0 (zero). Dados numéricos válidos são
um sinal opcional, seguido de um ou mais dígitos (opcionalmente contendo um
ponto decimal), seguido de um expoente, também opcional. O expoente é um 'e' ou
'E' seguido de um ou mais dígitos.
Para mais informações sobre esta conversão, veja a página sobre strtod(3) no
manual UNIX.
Para testar qualquer exemplo desta seção, copie-os e cole-os inserindo
a linha a seguir para ver o que está acontecendo:
Não espere obter o código de um caractere na conversão para inteiro,
como é feito em C. Use as funções ord() e
chr() para converter entre código ASCII e os próprios
caracteres.
Detalhes do tipo string
A string no PHP é implementada como um array de bytes e um
inteiro indicando seu tamanho no buffer. Não existem informações de como
esses bytes são traduzidos em caracteres, ficando essa tarefa com o programador.
Não existem limitações sobre a composição dos valores da string; em
particular, bytes com valor 0
(“NUL bytes”) são permitidos
em qualquer lugar da string (entretanto, algumas funções, mencionadas neste manual como não
“binary safe”, podem repassar as strings para bibliotecas que ignorem os dados
após o byte nulo.)
Esta natureza do tipo string explica o motivo de não haver o tipo "byte" disponível
no PHP – as strings assumem este papel. Funções que não retornam nenhuma informação textual – por
exemplo, dados arbitrários lidos de um socket de rede – continuarão retornando
strings.
Dado que o PHP não dita uma codificação específica para strings, pode-se
questionar como strings literais seriam codificadas. Por exemplo, a string
"á"
é equivalente a "\xE1"
(ISO-8859-1),
"\xC3\xA1"
(UTF-8, C form),
"\x61\xCC\x81"
(UTF-8, D form) ou qualquer outra representação
possível? A resposta é que a string poderá ser codificada em qualquer forma
que o arquivo de script estiver codificado. Assim, se o script for escrito na
codificação ISO-8859-1, a string será codificada como ISO-8859-1 e assim por diante. Entretanto,
isso não se aplica se o Zend Multibyte estiver ativado; neste caso, o script
pode ser escrito em uma codificação arbitrária (que é declarada explicitamente ou é
detectada) e então convertida em um codificação interna, a qual
será a codificação utilizada nas strings literais.
Note que há algumas restrições na codificação do script (ou na
codificação interna caso o Zend Multibyte esteja ativo) – isso quase sempre
significa que essa codificação deve ser um conjunto que contenha dentro de si a ASCII, como
UTF-8 ou ISO-8859-1. Note, entretanto, que codificações que são dependentes de estado, onde
os mesmos valores de bytes possam ser utilizados tanto em estados iniciais quanto não iniciais,
podem ser problemáticos.
Claro que, para serem úteis, funções que operam em textos podem ter que
fazer certas suposições sobre como as strings foram codificadas. Infelizmente, existem
muitas variações sobre este assunto através das funções do PHP:
-
Algumas funções assumem que a string foi codificada em alguma (qualquer) codificação de byte
único, mas elas não precisam interpretar estes bytes como caracteres
específicos. Este é por exemplo o caso das funções substr(),
strpos(), strlen() ou
strcmp(). Outra forma de refletir sobre essas funções é
que elas operam em buffers de memória, isto é, elas trabalham com bytes e deslocamento
de bytes.
-
Outras funções recebem a codificação da string, possivelmente elas
assumem um padrão se nenhuma informação lhes for passada. Este é o caso da função
htmlentities() e da maioria das funções
da extensão mbstring.
-
Outras utilizam o idioma atual (veja setlocale()), mas
elas operam byte-a-byte. Este é o caso das funções strcasecmp(),
strtoupper() e ucfirst().
Isso significa que podem ser utilizadas somente em codificações de byte único, desde que
a codificação corresponda com a definida pelo idioma. Por exemplo,
strtoupper("á")
pode retornar "Á"
se o
idioma estiver definido corretamente e á
, se codificado como byte
único. Se a string estiver codificada em UTF-8, o resultado correto não será retornado
e a string resultante pode ou não ser corrompida, dependendo
do idioma atual.
-
Finalmente, elas podem simplesmente assumir que a string esteja utilizando uma codificação específica,
geralmente UTF-8. Este é o caso da maioria das funções das extensões
intl e
PCRE
(na segunda, somente quando o modificador
u
é utilizado).
Devido a seu propósito especial, as funções
utf8_decode() assume a codificação UTF-8 e
utf8_encode() assume a codificação ISO-8859-1.
Por fim, isso significa que escrever programas corretos utilizando Unicode depende de
evitar cuidadosamente funções que não funcionam e que provavelmente
irão corromper os dados e usar, em substituição, funções que se comportem corretamente,
geralmente das extensões intl e
mbstring.
Entretanto, usar funções que manipulam codificações Unicode é somente o
começo. Não importa as funções que a linguagem provê, é essencial
saber a especificação Unicode. Por exemplo, um programa que supõem que só
existem maiúsculas e mínusculas está fazendo uma suposição errada.