PHP para Iniciantes: Tipos de Dados Primitivos - Textos Numéricos

Se você acompanhou todos os artigos até aqui, muitíssimo obrigado por sua ilustre presença! É bem provável que pensou que os tipos de dados haviam se esgotado, não é? Na verdade, você está certo. Não existe um tipo de dados que descreve um texto numérico (number? nah).

Porém, há um recurso no interpretador que consegue identificar um dado string como número, se escrito com a sintaxe correta. Esse assunto poderia ser conteúdo de um desses tipos mas achei melhor deixar para comentar agora, até para podermos explorar um pouco mais. Vamo nessa?

O que é um texto numérico?

Como o próprio nome diz, é um dado string que representa um número. Por exemplo:

<?php

echo "123";
echo "12.3";
echo "10000";

Sua definição é extremamente simples, não? Afinal, até aqui você conheceu números inteiros e ponto flutuante, então já conhece suas sintaxes.

Ok... E onde está a pegadinha, Kiko?

Hehehehe, pode parecer piada mas é sério. Essas tratativas existem pois muitas vezes precisamos manipular tipos de dados misturados e fazer operações matemáticas com pequenas partes dos dados. Isso se aplica, com toda certeza, em datas.

Por exemplo, quando você tem um campo data com o valor '1990-01-01' e você quer acrescentar 10 anos, sem usar nenhuma função de manipulação de data, o caminho que você precisaria fazer em outras linguagens seria:

  • capturar o primeiro pedaço da informação, que é o ano;
  • converter em número;
  • somar 10;
  • converter em texto;
  • substituir o valor no campo.

Porém, o interpretador consegue fazer esses castings sem você precisar lidar com isso manualmente. Ou seja, reduzindo para:

  • capturar o pedaço da informação;
  • somar 10;
  • substituir o valor no campo.
<?php
// o dado:
$data = '1990-01-01';

// função explode: quebra o texto em pedaços baseado no subtexto informado
$data = explode('-', $data); // no caso, quebra a cada '-', resultando no array ['1990', '01', '01']
// isso serve pra facilitar a captura da informação

 // soma 10 ao dado no primeiro índice, que é a string '1990', a informação capturada
$data[0] += 10; // ficando [2000, '01', '01'], onde o primeiro mudou de `string` pra `int`

// função implode: junta todos os elementos do array pelo texto informado
$data = implode('-', $data); // no caso, junta cada elemento com '-', resultando no texto '2000-01-01'

// impressão do resultado
echo $data;

Portanto, tem sim alguma utilidade, concorda?

Tá... Mas é só isso, Kiko?

Não! Tem uns detalhes bem loucos que eu fiquei pensando muito se valia a pena mencionar, mas já que está na documentação, vamos falar. Primeiramente, de todas as sintaxes dos números inteiros, apenas a escrita decimal é considerada nos textos numéricos. Por exemplo, '0b10' não entra na regra.

Já no caso dos pontos flutuantes, é possível escrever exponenciais da mesma forma '123e3'.

Além de tudo isso, ainda tem o conceito de leading numbers, que na tradução literal significa números principais, mas o significado é números à esquerda. Com isso, fica evidente que o PHP é capaz de pegar uma parte da string e operar como número independente do resto dos dados, desde que estejam separados por espaço em branco.

Por exemplo:

<?php

echo 1 + "12 feijão com arroz 34 feijão no prato (...)";
  • No PHP 8+, você receberá um E_WARNING (o que indica que nas próximas versões será considerado um ERRO) e, logo abaixo, o valor 13, resultante da soma 1 + 12;
  • No PHP 7.x, receberá um E_NOTICE (que é menos que um aviso e não é tão prejudicial - apenas deixando claro que você está fazendo alguma gambiarra) e o mesmo resultado, 13, da mesma soma;
  • Em versões anteriores, somente o resultado (...).

Mas Kiko, o que acontece com o 34?

Nada. Ao identificar um espaço em branco, o interpretador percebe que nem toda informação presente no texto representa um número. Por tanto, ele pega os números à esquerda e ignora todo o resto, resumindo tudo a 1 + 12.

E se antes viesse o texto?

<?php

echo 1 + "(...) 34 feijão no prato (...)";
  • No PHP 8+, FatalError (ops);
  • No PHP 7.x, um E_WARNING por não conseguir extrair nenhum número, e então converter o texto inteiro para 0 e imprimir 1;
  • Em versões anteriores, somente 1.

Então não, o interpretador não vai perder tempo procurando número pra fazer uma soma, rs. O interessante é que o espaço em branco é uma exceção nesses casos. Se você colocar um espaço em branco antes do número, a sequência de números será considerada trailing numbers, que é literalmente números à direita.

Por exemplo:

<?php

echo 1 + " 34 feijão no prato (...)";

Nesse caso, irá operar como se o espaço em branco não existe, dando o mesmo resultado de quando o texto começa com os números.

Ok... E onde isso é útil, Kiko?

Aí eu já não sei, hahahaha. Se o PHP 8 já te dá WARNING por isso, é melhor nem pensar em uma forma de aplicar. Só finge que não sabe que existe... E se encontrar, corrija!

Curtiu? Comenta e compartilha! Vamos compartilhar todo conhecimento possível. Inclusive, se você está estudando algumas outras coisas, quero te pedir encarecidamente que crie seu próprio blog no ! Precisamos trazer mais conteúdo pt-BR pra galera.

Inté!