Tipo Integer no PHP

Artigo que explica como funciona o tipo int (integer ou inteiro) na linguagem PHP e algumas utilidades como formatação de números, notações especiais e conversões entre tipos de dados.

Você realmente conhece o tipo integer oferecido por PHP? Ele representa um número inteiro. Bom, mas não estamos aqui para falar o que todo mundo que programa em PHP já sabe. Vamos falar sobre coisas interessantes.


Representação de Números Inteiros

O tipo inteiro pode ser expresso de 3 maneiras básicas:

  • Notação em base decimal
  • Notação em base octal
  • Notação em base hexadecimal

Todas as notações aceitam valores negativos quando precedidos do símbolo "-" (sem as aspas).

Na base decimal, o número pode ser zero ou começar com um dígito diferente de zero e ser acompanhado, opcionalmente, de dígitos entre 0 e 9. É a forma mais comum de representar um número.

$i = 0; // Zero
$i = 1; // Um
$i = 13; // Treze

Na base octal, o número precisa começar com o dígito zero e ser acompanhado por uma sequência de dígitos entre 0 e 7. Acho que é a forma mais incomum de representar um número. Que eu me recorde, a única aplicação desta notação é para utilização pela função chmod ou mkdir. Estas funções recebem valores octais. No sistema de permissões do Linux, este tipo de notação é bastante conhecida para aplicar permissões sobre arquivos ou diretórios.

$o = 00; // Zero
$o = 01; // Um (decimal)
$o = 07; // Sete (decimal)
$o = 010; // Oito (decimal)
$o = 011; // Nove (decimal)
$o = 012; // Dez (decimal)

// Colocar permissao sobre o arquivo /tmp/arquivo
// Dono: ler, escrever, executar
// Grupo: ler, executar
// Outros: ler
chmod('/tmp/arquivo', 0751);

// Para entender como funciona, você precisa ver o numero em binario:
// Octal / Binario
//     7 / 111
//     6 / 110
//     5 / 101
//     4 / 100
//     3 / 011
//     2 / 010
//     1 / 001
//     0 / 000
//
// Primeiro bit = permissao leitura (read)
// Segundo bit = permissao escrita (write)
// Terceiro bit = permissao execucao (execute)

Finalmente, na base hexadecimal, o número precisa começar com o prefixo "0x" (sem as aspas) e ser seguido de uma sequência de dígitos entre 0 e F (sendo que as letras de "a" até "f" não são sensíveis à caixa). Esta notação é mais comum que a notação octal. Pode ser usada, por exemplo, para repreentar valores entre 0 e 255, que são comuns para representar cores em RGB.

$h = 0x0; // Zero (decimal)
$h = 0x1; // Um (decimal)
$h = 0x9; // Nove (decimal)
$h = 0xA; // Dez (decimal)
$h = 0xB; // Onze (decimal)
$h = 0xE; // Quinze (decimal)
$h = 0xF; // Dezesseis (decimal)
$h = 0x10; // Dezessete (decimal)
$h = 0xFF; // 255 (decimal)
$h = 0x1B3; // 435 (decimal)

Conversão para Inteiro

Uma característica interessante de PHP é a facilidade de converter valores entre os diferentes tipos. Mas você sabe o que ocorre com um valor quando é convertido para inteiro?

Float para Int

Quando um valor real é convertido para inteiro, suas casas decimais são ignoradas.

$i = intval(0.1); // $i = 0;
$i = intval(0.5); // $i = 0;
$i = intval(0.9); // $i = 0;
$i = intval(4.1); // $i = 4;
$i = intval(4.9999999); // $i = 4;
$i = intval(-1.1); // $i = -1;
$i = intval(-1.9); // $i = -1;

Observe que você não pode dizer que o valor é arredondado para baixo, já que para valores negativos ele é arredondado para cima (para um valor menos negativo).

Bool para Int

O valor true é convertido para o inteiro 1 (um), enquanto o valor false é convertido para o inteiro 0 (zero).

$i = intval(true); // $i = 1;
$i = intval(false); // $i = 0;

Array para Int

Array vazios são convertidos para o inteiro 0 (zero), enquanto os arrays não vazios são convertidos para o inteiro 1 (um).

$i = intval(array(3, 5, 2)); // $i = 1;
$i = intval(array()); // $i = 0;

String para Int

A conversão de uma string para inteiro é a mais complexa. A string é analisada da esquerda para a direira. Enquanto o dígito capturado é um numérico, ele é considerado parte do número. Assim que um dígito não númerico é encontrado ou a string terminou, o processamento é convertido. O número é avaliado apenas na notação decimal. A única exceção é sobre o símbolo "-", que indica que o valor é negativo.

$i = intval('0'); // 0
$i = intval('a'); // 0
$i = intval('1'); // 1
$i = intval('01'); // 1
$i = intval('012'); // 12
$i = intval('13a14'); // 13
$i = intval('a123'); // 0
$i = intval('12 13 14'); // 12
$i = intval('-12 -13 -14'); // -12

Object para Int

Objetos não podem ser convertidos em Inteiro.


Curiosidades

A função "is_int" ou "is_integer" verifica se uma variável tem o tipo inteiro. Uma string com o valor "1" não é considerado um inteiro, embora possua um valor numérico. Já a função "is_numeric" verifica se o valor informado é um número. Isso incluem valores inteiros, reais ou string com valores que podem ser convertidos para inteiro ou real utilizando todos os caracteres.

$b = is_int(1); // true
$b = is_int(-4); // true
$b = is_int(2.3); // false
$b = is_int('1'); // false

$b = is_numeric(1); // true
$b = is_numeric(-4); // true
$b = is_numeric(2.3); // true
$b = is_numeric('1'); // true
$b = is_numeric('2.3'); // true
$b = is_numeric('0x1F'); // true (hexadecimal) false a partir do PHP 7
$b = is_numeric('4e2'); // true (4 * 102)
$b = is_numeric('12a'); // false (caractere "a" foi ignorado)
$b = is_numeric('a'); // false (caractere "a" não é digito)
$b = is_numeric('-1'); // true

0 comentários