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: O tipo string possui o tamanho máximo de 2GB (máximo de 2147483647 bytes)
Uma string literal pode ser especificada de quatro formas diferentes.
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.
<?php
echo 'isto é uma string comum';
echo 'Você pode incluir novas linhas em strings,
dessa maneira que estará
tudo bem';
// Imprime: Arnold disse uma vez: "I'll be back"
echo 'Arnold disse uma vez: "I\'ll be back"';
// Imprime: Você tem certeza em apagar C:\*.*?
echo 'Você tem certeza em apagar C:\\*.*?';
// Imprime: Você tem certeza em apagar C:\*.*?
echo 'Você tem certeza em apagar C:\*.*?';
// Imprime: Isto não será substituido: \n uma nova linha
echo 'Isto não será substituido: \n uma nova linha';
// Imprime: Variáveis $também não $expandem
echo 'Variáveis $também não $expandem';
?>
Se a string for delimitada entre aspas duplas ("), o PHP interpretará a seguinte sequência de escape como caracteres especiais:
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) (desde o PHP 5.2.5) |
\e | escape (ESC or 0x1B (27) em ASCII) (desde o PHP 5.4.4) |
\f | form feed (FF ou 0x0C (12) em ASCII) (desde o 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.
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 que 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.
É 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.
Heredocs não podem ser usados para inicializar propriedades de classes. Desde o PHP 5.3, esta limitação é válida somente para heredocs que contêm variáveis.
Exemplo #1 Exemplo inválido
<?php
class foo {
public $bar = <<<EOT
bar
EOT;
}
?>
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 #2 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 #3 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 #4 Utilizando o Heredoc na inicialização de valores estáticos
<?php
// Static variables
function foo()
{
static $bar = <<<LABEL
Nothing in here...
LABEL;
}
// Class properties/constants
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 #5 Usando aspas no Heredoc
<?php
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?>
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 seqüência <<< usada para heredocs, mas o identificador precisa ficar entre aspas simples, e.g. <<<'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 #6 Exemplo de string em Nowdoc
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
/* Exemplo mais complexo, com variáveis. */
class foo
{
public $foo;
public $bar;
function foo()
{
$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 #7 Exemplo de dado estático
<?php
class foo {
public $bar = <<<'EOT'
bar
EOT;
}
?>
Nota:
Suporte a Nowdoc foi adicionado no PHP 5.3.0.
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 um 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.
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.
<?php
$juice = "apple";
echo "He drank some $juice juice.".PHP_EOL;
// Invalid. "s" is a valid character for a variable name, but the variable is $juice.
echo "He drank some juice made of $juices.";
// Valid. Explicitly specify the end of the variable name by enclosing it in braces:
echo "He drank some juice made of ${juice}s."
?>
O exemplo acima irá imprimir:
He drank some apple juice. He drank some juice made of . He drank some juice made of apples.
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 #8 Simple syntax example
<?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 .
Para qualquer coisa mais complexa, você deve utilizar a sintaxe complexa.
Isto não é chamado sintaxe complexa porque a sintaxe é complexa, mas sim para 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 para torná-lo claro:
<?php
// Show all errors
error_reporting(E_ALL);
$great = 'fantastic';
// Won't work, outputs: This is { fantastic}
echo "This is { $great}";
// Works, outputs: This is fantastic
echo "This is {$great}";
// Works
echo "This square is {$square->width}00 centimeters broad.";
// Works, quoted keys only work using the curly brace syntax
echo "This works: {$arr['key']}";
// Works
echo "This works: {$arr[4][3]}";
// This is wrong for the same reason as $foo[bar] is wrong outside a string.
// In other words, it will still work, but only because PHP first looks for a
// constant named foo; an error of level E_NOTICE (undefined constant) will be
// thrown.
echo "This is wrong: {$arr[foo][3]}";
// Works. When using multi-dimensional arrays, always use braces around arrays
// when inside of strings
echo "This works: {$arr['foo'][3]}";
// Works.
echo "This works: " . $arr['foo'][3];
echo "This works too: {$obj->values[3]->name}";
echo "This is the value of the var named $name: {${$name}}";
echo "This is the value of the var named by the return value of getName(): {${getName()}}";
echo "This is the value of the var named by the return value of \$object->getName(): {${$object->getName()}}";
// Won't work, outputs: This is the return value of getName(): {getName()}
echo "This is the return value of getName(): {getName()}";
?>
Também é possível acessar propriedades de classes usando variáveis que contêm strings utilizando esta sintaxe.
<?php
class foo {
var $bar = 'I am bar.';
}
$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[1]}}\n";
?>
O exemplo acima irá imprimir:
I am bar. I am bar.
Nota:
Funções, chamadas a métodos, variáveis estáticas de classe e constantes de classe dentro de {$} funcionam desde o 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.
<?php
// Show all errors.
error_reporting(E_ALL);
class beers {
const softdrink = 'rootbeer';
public static $ale = 'ipa';
}
$rootbeer = 'A & W';
$ipa = 'Alexander Keith\'s';
// This works; outputs: I'd like an A & W
echo "I'd like an {${beers::softdrink}}\n";
// This works too; outputs: I'd like an Alexander Keith's
echo "I'd like an {${beers::$ale}}\n";
?>
É possível acessar e modificar caracteres dentro de strings especificando a posição, baseada em zero, do caractere desejado na string usando de 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: Strings também podem ser acessadas usando colchetes, como em $str{42}, com o mesmo propósito.
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 E_NOTICE
.
Deslocamento negativo emite E_NOTICE
na escrita e uma uma string vazia na leitura.
Somente o primeiro caractere de uma string atribuída é usada.
Atribuir uma string vazia atribui o byte NULL.
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.
Exemplo #9 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 #10 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 {}.
Strings podem ser concatenadas utilizando o operador '.' (ponto). Note que o operador '+' (adição) não funciona para isso. Veja operadores de string para mais informações.
Há bastantes funções úteis para manipulação de strings.
Veja a seção de funções de string para funções gerais e as funções de expressões regulares ou as funções de expressões regulares compatíveis com Perl para funcionalidades avançadas de localização & e substituição.
Há também funções para strings URL e funções para criptografia/descriptografia de strings (mcrypt e mhash).
Finalmente, veja também as funções de tipos de caracteres.
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.
Objetos, no PHP 4, são sempre convertidos para a string "Object". Para imprimir os valores das propriedades do objeto para depuração, leia os parágrafos a seguir. Para obter o nome da classe utilize a função get_class(). A partir do PHP 5, o método __toString é usado quando aplicável.
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(). Se o PHP engine tiver sido compilado com suporte ao WDDX, os valores no PHP também poderão ser serializados como XML.
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.
<?php
$foo = 1 + "10.5"; // $foo is float (11.5)
$foo = 1 + "-1.3e3"; // $foo is float (-1299)
$foo = 1 + "bob-1.3e3"; // $foo is integer (1)
$foo = 1 + "bob3"; // $foo is integer (1)
$foo = 1 + "10 Small Pigs"; // $foo is integer (11)
$foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
$foo = "10.0 pigs " + 1; // $foo is float (11)
$foo = "10.0 pigs " + 1.0; // $foo is float (11)
?>
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:
<?php
echo "\$foo==$foo; tipo " . gettype ($foo) . "<br />\n";
?>
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.
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:
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.