Apostilas e Tutoriais

PHP Manual

Strings

Uma string é uma série de caracteres. No PHP, 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 suporte ao Unicode.

Nota: N√£o h√° nenhum problema nas strings se tornarem muito grandes. N√£o h√° nenhum limite para o tamanho de strings imposta pelo PHP, ent√£o n√£o h√° raz√£o para se preocupar com strings longas.

Sintaxe

Uma string literal pode ser especificada de três 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.

Nota: No PHP 3, um aviso com nível E_NOTICE será emitido quando isto acontecer.

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 once said: "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 entende 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

Novamente se você tentar escapar qualquer outro caracter, a contra barra será impressa também! Antes do PHP 5.1.1, contra barra em \{$var} não era exibida.

Mas 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

Outra maneira para delimitar strings √© utilizando a sintaxe heredoc ("<<<"). √Č informado um identificador (seguido por nova linha) depois de <<<, ent√£o a string, e ent√£o o mesmo identificador para fechar a delimita√ß√£o.

O identificador de fechamento precisa começar na primeira coluna da linha. Além, o identificador utilizado 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, \r em sistemas Macintosh. Fechando delimitador (possivelmente seguido por um ponto e v√≠rgula) precisa ser seguido por newline tamb√©m.

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, então um erro de interpretação (parse) será lançado na linha final do script.

Não é permitido usar sintaxe heredoc na inicialização de membros da classe. Ao inves, use outra sintaxe para strings.

Exemplo #1 Exemplo inv√°lido

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

Textos heredoc se comportam como strings 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;
?>

Nota: O suporte a heredoc foi acrescentado no PHP 4.

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.

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, você também pode interpretar um índice de array ou uma propriedade de objeto. Com índices de arrays, o colchete de fechamento (]) marca o final do índice. Para propriedades de objetos se aplicam as mesmas regras das variáveis comuns, embora não exista um truque para as propriedades de objetos como para as 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 nao use {colchetes} fora das strings tambem.

// Vamos ver 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 seguir
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 desta maneira.

De fato, você pode incluir qualquer valor no que esteja no espaço de nomes dentro de strings com esta sintaxe. Você simplesmente escreve a expressão da mesma maneira que faria fora da string, e então incluí-la entre chaves. Desde que você não pode escapar '{', esta sintaxe somente será reconhecida quando o $ é imediatamente seguido de um {. (Utilize "{\$" para obter um literal "{$"). Alguns exemplos para tornar isso mais claro:

<?php
// Vamos ver 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 razao 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, e ele
// lancara um erro do tipo E_NOTICE (undefined constant).
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 
"Voc√™ pode escrever 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.

Nota: Analisando variáveis dentros de strings usa mais memória que concatenação de strings. Quando escrevendo um script PHP no qual uso de memória é fundamental, considere usar o operador de concatenação (.), pois é melhor que analisar a string.

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: Elas podem também ser acessada usando colchetes, como $str{42} para o mesmo propósito. Contudo, usar colchete é preferível porque {chaves} é obsoleto no PHP 6.

Exemplo #3 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';

// M√©todo alternativo usando {} obsoleto no PHP 6
$third $str{2};

?>

Nota: Acessando por [] ou {} variáveis de outro tipo é retornado NULL sem emitir aviso.

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√° uma grande quantidade de 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 para busca e substitui√ß√£o avan√ßada.(em dois sabores: Perl e POSIX estendido).

H√° tamb√©m fun√ß√Ķes para strings URL e fun√ß√Ķes para criptografia e descriptografia de strings (mcrypt e mhash).

Finalmente, se voc√™ ainda n√£o encontrar o que est√° procurando, 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 settype().

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

Um integer ou n√ļmero de ponto flutuante (float) √© convertido para a representa√ß√£o string do n√ļmero em d√≠gitos ar√°bicos (incluindo a parte expoente para n√ļmeros de ponto flutuante). 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 a string "Array", ent√£o voc√™ n√£o pode exportar o conte√ļdo de um array com echo() ou print() para ver o que h√° dentro dela. Para ver um elemento, voc√™ precisa fazer algo como echo $arr['foo']. Veja abaixo dicas de como exportar/ver todo seu conte√ļdo.

Objetos 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.

Recursos 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).

Se você deseja testar qualquer um dos exemplo dessa seção, você pode copiar e colar os exemplos e inserir as linhas seguintes para ver por si mesmo como isso 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 voc√™ teria em C, por exemplo). Use as fun√ß√Ķes ord() e chr() para converter entre c√≥digo de caracteres e os pr√≥prios caracteres.


PHP Manual