PHP para Iniciantes: Tipos de Dados Primitivos - Volatilidade dos tipos

Para encerrar a lista de artigos sobre tipos de dados primitivos, vamos falar um pouco sobre como os tipos de dados se relacionam e convergem. Dito isso, é preciso ressaltar algo que foi abordado no artigo anterior, sobre declaração de tipos. Há tempos menciono que nenhuma variável pode ser forçada a seguir um tipo de dado em nossa linguagem. Isso porque PHP não é linguagem de tipagem forçada.

Dito isso, é possível presumir que, se um tipo de dado não é forçadamente controlado, ele está passível a conversões em tempo real, correto? E é isso mesmo. E nós podemos separar esses momentos de duas formas:

  • conversões declaradas: quando você deixa explícito no código que está convertendo um dado para outra tipagem, mais conhecida como casting;
  • conversões não-declaradas: quando você faz uma operação com tipos incompatíveis e o interpretador faz a conversão pra você, mais conhecida como juggling.

Juggling

É bem fácil de entender. Acho que reforcei isso em alguns artigos anteriores.

<?php

$variavel = "1"; // string
$variavel = $variavel + 1; // converte pra int
var_dump($variavel); // int(2)

$variavel = $variavel * 0.1; // converte pra float
var_dump($variavel); // float(0.2)

E é isso. Pra quem pratica muito disso acaba sacando quando está rolando uma conversão e identificando possíveis problemas ao longo do caminho baseando-se nisso. É aquele caso: você monta um fluxo esperado inteiros e, do nada, um dado no escopo interno virou ponto flutuante. Pode ser qualquer coisa: uma operação que exigiu a conversão ou até mesmo um número inteiro que extrapolou o limite de números inteiros.

E com isso eu só posso dizer: experiência! Somente quem vivenciar esses erros vai aprender a evitá-los. Não tenha medo de errar.

Casting

Para declarar uma conversão de tipo de dados, você pode tanto usar a função settype quanto colocar o tipo desejado entre parênteses na frente da informação a converter.

Por exemplo:

<?php

$variavel = "1"; // string
settype($variavel, "int"); // converte para int
var_dump($variavel); // int(1)

$variavel = (float) $variavel; // converte para float
var_dump($variavel); // float(1)

Além dessas formas, você também pode usar as funções de parsing existentes para todo tipo de dado. Mas fique atento que nem todo dado pode ser convertido. Nesses casos, erros podem acontecer. Além disso, pode haver perda de informações: de ponto flutuante para inteiro, de texto numérico para número, etc.

Tipo de dadoFunções de parsing
Booleanosboolval()
Números Inteirosintval()
Pontos flutuantesfloatval()
Textosstrval()
Nulosunset()

Ué, Kiko, e os outros tipos de dados?

Bom, conversões para arrays dependem do dado convertido, mas não possui uma função para declarar isso. Seria no velho e bom:

<?php
$variavel = 1;
$variavel = (array) 1; // que é o mesmo que fazer [1] ou array(1)
var_dump($variavel); // [1]

$objeto = new stdClass;
$objeto->nome = "Alan";
$variavel = (array) $objeto; // converte as propriedades públicas em array
var_dump($variavel); // array("nome" => "Alan");

Também é possível converter um texto para array usando a função str_split(). Porém acho absolutamente desnecessário, rs.

E sobre converter para objeto, você já me viu fazendo casting de array para objeto em uns exemplos anteriores!

<?php
$array = [
    'nome' => 'Armando',
];

$objeto = (object) $array;

echo $objeto->nome;

Enfim, você pode encontrar a lista de palavras-reservadas para casting na documentação oficial do PHP. Lá tem pelo menos três formas de exigir o mesmo casting. Por exemplo, os pontos flutuantes podem ser (float), (double) e (real)! Vale a pena dar uma conferida.

E por hoje é só! Não esquece de deixar aquele like, hein? No próximo artigo iremos finalmente mudar de assunto. Já estamos cansados de falar sobre tipos de dados primitivos, não é? Agora vamos nos aprofundar sobre variáveis. Tem um assunto muito irado que é variáveis variáveis capaz de deixar qualquer mente perturbada, rs.

Enfim, vamo nessa!

Inté!