XOOPS Brasil

 

Strings

Uma string é uma série de caracteres. Antes do PHP 6, um caracter é o mesmo que um byte. Ou seja, há exatamente 256 caracteres diferentes possíveis. Isto implica que o PHP não tem suporte nativo ao Unicode. Veja utf8_encode() e utf8_decode() para algumas funcionalidades básicas de Unicode.

Nota: Não é problema para uma string ser bastante longa. PHP não impõe limite de tamanho de uma string; o único limite é o de memória disponível do computador no qual o PHP está sendo executado.

Sintaxe

Uma string literal pode ser especificada de quatro formas diferentes.

Apóstrofos

A maneira mais simples para especificar uma string é delimitá-la entre apóstrofos (o caracter ').

Para especificar um apóstrofo. você precisará "escapá-la" com uma contra barra (\), como em muitas outras linguagens. Se uma contra barra precisa ocorrer antes de um apóstrofo ou no final da string, você precisa duplicá-la. Note que se você tentar escapar qualquer outro caracter, a contra barra também será impressa! Então geralmente não é necessário escapar a própria contra barra. Para especificar um apóstrofo, use escape (\). Para especificar uma barra invertida antes de uma apóstrofo, ou no final da string, use-o duas vezes (\\). Note que tentando usar escape qualquer outro caractere imprimirá a barra invertida também.

Nota: Diferentemente das duas outras sintaxes, variables e seqüências de escape para caracteres especiais não serão substituídas quando elas ocorrerem dentro de strings delimitadas por apóstrofes.

<?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: Variaveis $também não $expandem
echo 'Variaveis $também não $expandem';
?>

Aspas

Se a string é delimitada entre aspas ("), o PHP irá interpretar mais seqüências de escape para caracteres especiais:

Seqüências de escape
Seqüência Significado
\n fim de linha (linefeed ou LF ou 0x0A (10) em ASCII)
\r retorno de carro (carriage return ou 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)
\f form feed (FF ou 0x0C (12) em ASCII) (desde o PHP 5.2.5)
\\ contra barra ou barra invertida
\$ sinal de cifrão
\" aspas
\[0-7]{1,3} a seqüência de caracteres batendo a expressão regular dos caracteres em notação octal
\x[0-9A-Fa-f]{1,2} a seqüência de caracteres batendo a expressão regular de um caracter em notação hexadecimal

Como em uma string entre apóstrofos, usar escape em qualquer outro caractere resultará em uma barra invertida sendo mostrada também. Antes do PHP 5.1.1, a barra invertida em \{$var} não era mostrada.

O mais importante recurso de strings delimitadas por aspas está no fato de que nome de variáveis serão substituídos. Veja interpretação de strings para detalhes.

Heredoc

Uma terceira maneira para delimitar strings é a sintaxe heredoc: <<<. Após este operador, um identificador é fornecido, e após, um newline. Então vem a própria string, e então o mesmo identificador para fechar a string.

O identificador de fechamento precisa começar na primeira coluna da linha. Além, o identificador precisa seguir as mesmas regras de nomeação que qualquer outro rótulo no PHP: só pode conter caracteres alfanuméricos e sublinhados, e precisa começar com um caracter não numérico ou sublinhado.

Aviso

É muito importante verificar que a linha do identificador de fechamento não contenha nenhum outro caracter, exceto, possivelmente um ponto e vírgula (;). O que significa que o identificador não pode ser indentado, e que não pode haver nenhum espaço ou tabulações antes ou depois do ponto e vírgula. É também importante perceber que o primeiro caracter antes do identificador de fechamento precisa ser um caracter de nova linha como esperada por seu sistema operacional. Por exemplo, \n em sistemas UNIX, incluindo Mac OS X. O delimitador de fechamento (possivelmente seguido por um ponto e vírgula) precisa também ser seguido por newline.

Se essa regra for quebrada e o identificador de fechamento não estiver perfeito, então ele não será considerado como identificador de fechamento e o PHP irá continuar procurando por um. Se, neste caso, um identificador de fechamento apropriado não for encontrado antes do final do arquivo atual, um erro de interpretação (parse) será lançado na linha final do script.

Heredocs não podem ser usados para inicializar membros de classes. Use ao invés, nowdocs.

Exemplo #1 Exemplo inválido

<?php
class foo {
    public 
$bar = <<<EOT
bar
EOT;
}
?>

Textos heredoc se comportam como string delimitadas por aspas, com apenas uma diferença. Você não precisa escapar apóstrofos e aspas em seus heredocs, mas você ainda pode continuar utilizando os códigos de escape listados acima. Variáveis são substituídas, mas o mesmo cuidado precisa ser tomado quando expressando variáveis complexas dentro de heredocs 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

É também possível usar sintaxe Heredoc para passar dados para argumento de funções:

Exemplo #3 Exemplo de Heredoc em argumentos

<?php
var_dump
(array(<<<EOD
foobar!
EOD
));
?>

Nota:

O suporte a heredoc foi acrescentado no PHP 4.

Nowdoc

Nowdocs são para apóstrofos o que heredocs são para aspas dupla em strings. Um nowdoc é especificado similarmente a um heredoc, mas nenhuma análise é feito dentro de um nowdoc. A construção é ideal para colocar códigos PHP ou outros blocos grandes de texto sem a necessidade de usar escapes. Ele 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 se aplicam para identificadores nowdoc, especialmente aqueles considerando o identificador de fechamento.

Exemplo #4 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

Nota:

Diferente de heredocs, nowdocs pode ser usado no contexto de dado estático. O exemplo típico é inicializando membros de classes ou constantes:

Exemplo #5 Exemplo com 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 ou heredoc, variáveis são interpretadas dentro delas.

Há dois tipos de sintaxe: um simples e um complexo . A sintaxe simples é a mais comum e conveniente, provendo uma maneira de interpretar uma variável, um valor de array ou uma propriedade de object em uma string com o menor esforço.

A sintaxe completa foi introduzida no PHP 4, e pode ser reconhecida por chaves ({}) envolvendo a expressão.

Sintaxe simples

Se um sinal de cifrão ($) é encontrado, o interpretador tentará obter tantos identificadores quanto possíveis para formar um nome de variável válido. Envolva o nome da variável com chaves se você deseja explicitamente especificar o fim do nome.

<?php
$cerveja 
'Heineken';
echo 
"O sabor das '$cerveja's é otimo"// funciona, "'" é um caracter inválido para nome de variáveis
echo "Ele bebeu algumas $cervejas";     // não funciona, 's' é um caracter válido para nome de variáveis
echo "Ele bebeu algumas ${cerveja}s";   // funciona
echo "Ele bebeu algumas {$cerveja}s";   // funciona
?>

Similarmente, um índice de array ou uma propriedade de object pode ser analisado. Com índices de array, o fechamento de colchete (]) marca o final do índice. A mesma regra aplica-se para propriedade de objetos como para simples variáveis.

<?php
// Esses exemplos são específicos para utilização de arrays dentro de strings
// Quando fora de strings, sempre delimite suas chaves de array strings
// e não use {colchetes}.

// Mostra todos os erros
error_reporting(E_ALL);

$fruits = array('morango' => 'vermelho''banana' => 'amarelo');

// Funciona, mas note que funciona de maneira diferente fora dos delimitadores de strings
echo "A banana é $fruits[banana].";

// Funciona
echo "A banana é {$fruits['banana']}.";

// Funciona, mas o PHP procura por uma constante chamada 'banana' antes,
// como descrito a abaixo.
echo "A banana é {$fruits[banana]}.";

// Nao funciona, use colchetes. Isto lanca um parse error.
echo "A banana é $fruits['banana'].";

// Funciona
echo "A banana é " $fruits['banana'] . ".";

// Funciona
echo "Este quadrado tem $square->width metros de lado.";

// Nao funciona. Para uma solução, veja a sintaxe complexa.
echo "Este quadrado tem $square->width00 centímetros de lado.";
?>

Para qualquer coisa mais complexa, você precisa utilizar a sintaxe complexa.

Sintaxe complexa (chaves)

Isto não é chamado sintaxe complexa porque a sintaxe em si é complexa, mas porque você pode incluir expressões complexas.

De fato, qualquer valor no namespace pode ser incluido em uma string com esta sintaxe. Simplesmente escreva a expressão da mesma forma como apareceria fora da string, e então coloque-o em { e }. Desde que { não pode escapado, esta sintaxe somente mostrará ser reconhecida quando o $ imediatamente seguir o {. Use {\$ para ter um literal {$. Alguns exemplos para fazê-lo claro:

<?php
// Mostra todos os erros
error_reporting(E_ALL);

$bom 'fantastico';

// Não funciona, imprimindo: Isto é { fantastico}
echo "Isto é { $bom}";

// Funciona, imprimindo: Isto é fantástico
echo "Isto é {$bom}";
echo 
"Isto é ${bom}";

// Funciona
echo "Este quadrado tem {$square->width}00 centímetros de lado.";

// Funciona
echo "Isto funciona: {$arr[4][3]}";

// Isto está errado pela mesma razão que $foo[bar] é errado fora de uma string.
// Em outras palavras, isto ainda funciona MAS porque o PHP primeiro procura pro uma
// constante nomeada foo; um erro do tipo E_NOTICE (undefined constant) será
// disparado.
echo "Isto é errado: {$arr[foo][3]}";

// Funciona. Quanto mexendo com arrays multi dimensionais, sempre use colchetes em volta dos arrays
// quando detro de strings
echo "Isto funciona: {$arr['foo'][3]}";

// Funciona
echo "Isto funciona: " $arr['foo'][3];

echo 
"Isto funciona também {$obj->values[3]->name}";

echo 
"Este é o valor da variável chamada $name{${$name}}";

echo 
"Este é o valor da variável usando o valor retornado da getName(): {${getName()}}";

echo 
"Este é o valor da variável usando o valor retornado da \$object->getName(): {${$object->getName()}}";
?>

Nota:

Chamada de funções e métodos dentro de {$} funcionam desde o PHP 5.

Acesso e modificação de caracteres da string

Caracteres nas strings podem ser acessados e modificados apenas especificando o deslocamento baseado em zero do caracter desejado depois da string dentro de colchetes, como um array, $str[42] então pense na string como um array de caracteres.

Nota: Strings podem também ser acessada usando colchetes, como $str{42} para o mesmo propósito. Contudo, esta sintaxe está obsoleto a partir do PHP 6. Use colchetes ao invés.

Aviso

Escrevendo em um offset fora do intervalo, preenche a string com espaços. Tipos diferentes de inteiro são convertidos para inteiro. Tipo ilegal de offset emite E_NOTICE. Offset negativo emite E_NOTICE na escrita mas na leitura uma string vazia. Somente o primeiro caractere de uma string atribuída é usada. Atribuindo uma string vazia designa NUL byte.

Exemplo #6 Alguns exemplos com strings

<?php
// Pega o primeiro caracter da string
$str 'Isto é um teste.';
$first $str[0];

// Pega o terceiro caracter da string
$third $str[2];

// Pega o último caracter da string
$str 'Isto ainda é um teste.';
$last $str[strlen($str)-1];

// Modifica o ultimo caracter da string
$str 'Olhe o mal';
$str[strlen($str)-1] = 'r';

?>

Nota:

Acessando variáveis de outros tipos usando [] ou {} silenciosamente retorna NULL.

Funções e operadores úteis

Strings podem ser concatenados utilizando o operador '.' (ponto). Note que o operador '+' (adição) não funciona para isso. Veja operadores de string para mais informações.

Há bastante funções úteis para modificação de strings.

Veja a seção de funções de string para funções gerais e funções de expressões regulares ou a funções para expressão regular compatível com Perl para busca avançada & funcionalidade para substituições.

Há também funções para strings URL e funções para criptografia e descriptografia de strings (mcrypt e mhash).

Finalmente, veja também as funções de tipos de caracteres.

Convertendo para strings

Você pode converter um valor para string utilizando o molde (string), ou a função strval(). Conversão para string é automaticamente realizada no escopo de uma expressão para você onde uma string é necessária. Isto acontece quando você usa as funções echo() ou print(), ou quando você compara o valor de uma variável com uma string. Lendo as seções do manual sobre Tipos e Conversão de Tipos tornará o que se segue um pouco mais claro. Veja também a função settype().

O valor boolean TRUE é convertido para a string "1", o valor FALSE é representado como "" (uma string vazia). Desta forma, você pode converter livremente entre os tipos booleano e string.

Um integer ou um float é convertido para a representação string do número em dígitos arábicos (incluindo a parte expoente para um float). Números de ponto flutuante podem ser convertidos usando a notação exponencial (4.1E+6).

Nota:

O caractere de ponto decimal é definido no locale do script (categoria LC_NUMERIC). Veja setlocale().

Arrays são sempre convertidos para uma string "Array"; por causa disso echo() e print() não podem por eles mesmo mostrar o conteúdo de um array. Para ver um elemento, use a construção como echo $arr['foo']. Veja abaixo dicas de como exportar/ver todo seu conteúdo.

Objects no PHP 4 são sempre convertidos para a string "Object". Se você quiser imprimir os valores das variáveis membro de um object por razão de debug, leia os parágrafos abaixo. Se você quiser encontrar o nome da classe do qual o objeto é uma instância, use get_class(). No PHP 5, o método __toString é usado se aplicável.

Resources são sempre convertidos para strings na estrutura "Resource id #1" onde 1 é o número único do resource assimilado pelo PHP na execução. Se você quiser obter o tipo do recurso, utilize get_resource_type().

NULL é sempre convertido para uma string vazia.

Como você viu acima, imprimir arrays, objetos ou recursos não fornece qualquer informação útil sobre os seus próprios valores. Veja as funções print_r() e var_dump() para melhores maneiras de imprimir valores para debug.

Você também pode converter valores PHP para strings para armazená-los permanentemente. Este método é chamado serialização, e pode ser feito com a função serialize(). Você também pode serializar valores PHP para estruturas XML , se você ativou o suporte a WDDX na configuração do seu PHP.

Conversão de strings para números

Quando uma string é avaliada como um valor numérico, o valor resultante e o tipo é determinado como segue.

A string será avaliada como um ponto flutuante se conter qualquer um dos caracteres '.', 'e', ou 'E'. Em outros casos, ela será avaliada como um inteiro.

O valor é obtido da porção inicial da string. Se a string começa com dados numéricos válidos, esse será o valor utilizado. Em outro caso, o valor será 0 (zero). Dados numéricos válidos são: um sinal opcional, seguido por 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 
"10.5";                // $foo é float (11.5)
$foo "-1.3e3";              // $foo é float (-1299)
$foo "bob-1.3e3";           // $foo é integer (1)
$foo "bob3";                // $foo é integer (1)
$foo "10 Small Pigs";       // $foo é integer (11)
$foo "10.2 Little Piggies"// $foo é float (14.2)
$foo "10.0 pigs " 1;          // $foo é float (11)
$foo "10.0 pigs " 1.0;        // $foo é float (11)
?>

Para mais informações sobre esta conversão, veja página do manual UNIX de strtod(3).

Para testar qualquer exemplo nesta seção, copie e cole os exemplos e insira a seguinte linha para ver como funciona:

<?php
echo "\$foo==$foo; tipo " gettype ($foo) . "<br />\n";
?>

Não espere obter o código de um caracter por convertê-lo para inteiro, como é feito em C. Use as funções ord() e chr() para converter entre código de caracteres e os próprios caracteres.