PHP para Iniciantes: Tipos de Dados Primitivos - Textos

Enfim chegamos ao último mas não menos importante tipo de dado primitivo escalar. Todos são importantes à sua maneira, mas texto é o tipo de dado mais utilizado em todos os contextos. De uma mera informação textual até datas, quando você não sabe que tipo de dado utilizar você pode seguramente assumir o tipo string.

Antes de começarmos gostaria de alertá-lo de que não há uma tradução para o tipo String como o que mencionei (Texto). Foi total invenção da minha cabeça na única intenção de facilitar a leitura desse artigo... Afinal, você pode nunca ter nem escutado sobre essa palavra, certo? E "texto" cai muito bem sobre o que costumamos fazer com esse dado em outras linguagens. Agora que está avisado, vamos às informações!

O que é uma String em PHP?

Como mencionei na introdução de tipos de dados primitivos, em outras linguagens, string não é considerado um tipo de dado escalar por não passar de um array de caracteres. Nesses casos, eles têm um tipo Char como escalar no lugar das Strings. Já no PHP, não existe char. Tudo é string. Se não for, é outro tipo de dado que não tem a ver com texto... Daí a minha tradução possivelmente esdrúxula.

Dito isso, você pode imaginar string tanto como a menor unidade de um texto quanto o texto em si. Você pode manipular caractere a caractere ou toda a informação usando as mesmas funções de manipulação de string... E tudo certo! Ninguém vai te julgar. Você pode até mesmo escrever outros dados em string como forma de serialização ou desserialização de dados.

O que raios é isso, Kiko?

Sinto muito, mas não vou explicar a fundo. Apenas entenda que serializar é o ato de capturar alguma coisa e registrar seu dado fixo em algum formato e desserializar é recuperar essa coisa a partir do registro. Você já assisitiu "Pistas de Blue", um desenho infantil? Eu assisto bastante com minhas filhas... E eles fazem isso muitas vezes! Do nada, uma foto serializada na parede vira um portal e eles entram lá e... puf: estão dentro da foto. Chamo isso de desserializar porque infelizmente nossas fotos não são como as de Harry Potter, são todas estáticas. Enfim, esse é o máximo que posso ir para não fugir muito do contexto do artigo, beleza? Se ainda não entendeu, comenta aí que te explico melhor!

Como escrever uma string?

Temos, ao todo, quatro formas diferentes de escrever uma string:

  • entre aspas simples:
    <?php
    echo 'um texto qualquer';
    
  • entre aspas duplas:
    <?php
    echo "um texto quaquer";
    
  • heredoc (você determina a palavra-chave de encerramento):
    <?php
    echo <<<ALGUMACOISA
    um texto qualquer
    ALGUMACOISA;
    
  • nowdoc (o mesmo que heredoc, mas a definição de palavra-chave fica entre aspas simples):
    <?php
    echo <<<'ALGUMACOISA'
    um texto qualquer
    ALGUMACOISA;
    

Tem alguma diferença além da escrita, Kiko?

Com certeza. O interpretador do PHP faz ações diferentes para cada caso, o que significa que se você já programa na linguagem e não sabe desses detalhes, é bem possível que você esteja abusando de certos recursos no tratamento de textos.

Por exemplo, assim como em outras linguagens, no PHP é possível inserir valores dinâmicos na definição de uma string. Eu não tenho como explicar melhor os exemplos para você pois ainda não chegamos no assunto de variáveis, então pode ser que fique mais claro quando chegarmos lá. Mas vamos tentar! Veja o código a seguir:

<?php
$nome = 'Joao';
$texto = "Oi, $nome! Que prazer ve-lo por aqui!";
echo <<<FIM
Voce recebeu uma mensagem: "$texto".
FIM;

Acredite se quiser (ou rode pra checar, hehe), mas o resultado disso é

Voce recebeu uma mensagem: "Oi, Joao! Que prazer ve-lo por aqui!".

Nos exemplos acima, eu inseri o valor da variável $nome em $texto, e depois o valor de $texto na Heredoc final. Daí os valores dinâmicos. No caso, dentre as notações possíveis, você pode separar em dois grupos: as que podem e as que não podem fazer parsing, que é a ação de transformar uma informação em outra, podendo ser desde um código pré-definido (por ex., \n que é quebra de linha) até a inserção do valor atual de alguma variável.

Notações sem parsing

São as notações com aspas simples e a Nowdoc. Viu que eu escrevi 'Joao' na variável $nome ali no exemplo? Se você tentar mudar a notação da variável $texto para aspas simples, você não irá mais capturar o valor de $nome. Aí no lugar de Oi, Joao (...) você terá Oi, $nome (...). O Nowdoc é basicamente a mesma coisa.

Notações com parsing

Bom, se as duas anteriores eram sem, as duas que sobraram são as que tem algum parsing no interpretador do PHP: aspas duplas e Heredoc.

Mas Kiko, quais formas de parsing existem?

São muitas! Muitas mesmo. Eu mencionei quebra de linha, mas tem muito mais registrado numa tabela na documentação oficial de aspas duplas no PHP.net. Ao invés de escrever o conteúdo da tabela aqui, é preferível que abra a documentação e veja por lá, afinal, minha principal finalidade é acostumá-lo(a) a buscar informações lá mesmo.

Além disso, quando falamos de Orientação a Objeto ou Arrays (coisas que ainda estão por vir nos artigos aqui), tem outros caracteres que entram na jogada. Por exemplo, as chaves {e }: ao usar em uma das sintaxes com parsing, você estará explicitamente dizendo para o PHP que o conteúdo ali dentro será uma variável - e essa variável pode ser um tipo de dado escalar qualquer, um objeto com propriedades/métodos acessíveis ou um array onde você quer acessar um índice específico.

Aaaaah, Kiko, manda nudes exemplos pô!

Pra já!

<?php
$inteiro = 123;
$float = 12.3;
$array = ["nome" => Joao];
$objeto = (object) $array;

// imprindo inteiro e float
echo "Inteiro {$inteiro}, float {$float}";

// puxando coluna nome do array
echo "Oi, {$array['nome']}!";

// puxando propriedade nome do objeto
echo "Oi, {$objeto->nome}...";

Caractere por caractere

Além de tudo isso, lembra que mencionei que você pode pegar uma unidade do texto sem fazer qualquer conversão? Então... A sintaxe de consulta de um caractere é similar a sintaxe de arrays (que vou presumir que você não sabe, porque ainda não falei sobre isso). Usando colchetes ([ e ]) após a variável string, você estará informando ao interpretador que deseja acessar um caractere específico do texto. Por exemplo:

<?php
$nome = 'Joao';

$primeiraLetra = $nome[0];
$ultimaLetra =$nome[-1];
echo "{$primeiraLetra}_{$ultimaLetra}";

Quando você informa um número positivo, você estará fazendo uma leitura da esquerda para a direita, onde o primeiro índice é o 0. Já com números negativos, a leitura é da direita para a esquerda, onde o primeiro índice é o -1.

Ou seja, aquela string 'Joao' pode ser representada da seguinte forma:

JOAO
LTR0123
RTL-4-3-2-1

* LTR significa Left To Right (da esquerda para a direita), RTL é Right To Left (da direita para a esquerda).

No caso, qualquer string pode ser vista dessa forma. A questão é que qualquer caractere vira uma coluna nessa estrutura. Espaços em branco, quebras de linha, tabulações, etc. Então não é muito seguro contar com esse recurso para pegar caracteres no meio de dados dinâmicos.

Nota: se você tentar acessar um índice que não existe (seja positivo ou negativo, conforme o mencionado acima), o PHP emitirá um erro não muito agradável, rs.

Cada caso é um caso

E determinadas complexidades exigem determinadas soluções. Há diversas funções para auxiliar no tratamento de strings mas não irei mencionar nesse artigo, pois ainda não chegamos nem no assunto de funções, então não faz sentido mencionar isso agora, tudo bem?

Da mesma forma, tem detalhes mais obscuros sobre como esses textos são armazenados. Na documentação há menção sobre o armazenamento ser um array de bytes cuja codificação depende da codificação do arquivo que está sendo interpretado (com exceção de quando a extensão Zend está ativada).

O que é codificação, Kiko?

Você percebeu que eu não coloquei nenhuma acentuação nos exemplos até agora? Meu objetivo com isso foi evitar bugs de codificação para quem nem viu string até então. Muitas codificações não sabem o que é um acento, um cecidilha, um til, nem nada. Na maioria dos casos, essas codificações esperam que toda a informação em cada caractere esteja registrado no mesmo byte. E o que acontece na prática é que uma letra fica num byte e a acentuação fica em outro (daí o termo MB, Multi-Byte). UTF-8 é uma codificação que suporta isso, enquanto ISO-8859-1 não.

Se você salvar o seu arquivo .php com a codificação ISO-8859-1 colocando algum $nome dos exemplos acima sendo 'João', verá o problema.

E por hoje é só! Comenta aí se aprendeu alguma coisa nesse artigo e compartilha com suas amizades! No próximo artigo iremos continuar o assunto de tipos de dados primitivos, iniciando o grupo de tipos compostos com Arrays. Nos vemos lá.

Inté!