Tutorial PHP: Tipos de Dados

Tutorial PHP: Tipos de Dados

Assim como outras linguagens de programação, no PHP também temos que lidar com os tipos de dados então antes de avançarmos para a parte de variáveis, precisamos entender melhor como isso funciona para termos uma maior controle sobre nosso código.

Porém, antes de falar dos tipos de dados do PHP precisamos entender melhor como o computador trabalha com esta informação, vejamos abaixo uma breve explicação:

Linguagem Binária

Tudo no computador acontece através de pulsos elétricos, estes pulsos podem estar “ligados” ou “desligados”, os quais são representados por 0 e 1, a isso chamados de linguagem binária.

Cada pulso elétrico representado pelos algarismos 0 e 1 recebe o nome de bit, e são nestes bits que são representados tanto os dados a serem processados, quanto as instruções do que deve ser feito com estes dados.

Os microprocessadores possuem uma memória interna chamada registrador, esses registradores são o nível mais alto na hierarquia da memória, ou seja, são as mais rápidas e mais caras de todas, por isso, a quantidade desses registradores é bem limitada.

Estes registradores são usados pelo processador para armazenamento da informação enquanto esta é processada, enquanto um programa está em execução, as instruções contidas na memória principal são movidas para os registradores, onde ficam até que sejam concluídas e depois voltam para a memória principal.

 

Palavra binária

Quando falamos em binário, se juntamos vários bits a fim de formar algo inteligível para nós, a este conjunto de bits damos o nome de palavra binária.

Um agrupamento de bits é chamado de BYTE e tem um tamanho (por definição) de 8 bits, podendo representar até (2 elevado a 8) o valor de 256 (em decimal).

Nos processadores modernos são usados agrupamentos de 32 bits, chamados de “palavra” e “palavra dubla” nos de 64 bits. Com isso, além de representar números cada vez maiores, os processadores também conseguiram endereçar um número maior de posições de memória (física), desde os 4 GBytes (4 trilhões) em processadores de 32 bits, para um número astronômico em processadores de 64 bits (tente calcular 2 elevado a 64).

Por exemplo:

Número 2 → 10 (palavra binária que representa o número 2)

Número 4 → 0100

Pausa para piadinha velha: Existem 10 tipos de pessoas, as que entendem binário e as que não entendem binário

De volta a programação

Observe que para cada número inteiro temos uma representação binária, o mesmo acontece para números reais (em programação chamado de número de ponto flutuante, este precisaremos voltar aos binários daqui a pouco), letras, palavras etc.

Voltando aos tipos de dados

E neste ponto chegamos a parte que nos remete aos tipos de dados, pois conforme dito acima, tudo é representado por palavras binárias, e como tal, ocupam um espaço na memória principal do computador, e também no processador durante a execução da instrução, o que vai definir quanto de espaço será reservado para este conteúdo é justamente o tipo de dados, no PHP os tipos de dados possíveis são:

Tipos primitivos

  • Escalares
    • boolean
    • integer
    • float ou double
    • string
  • Compostos
    • array
    • object
  • Especiais
    • resource
    • NULL

Abaixo uma descrição um pouco mais detalhada:

Tipo Boolean

Só recebe dois valores true ou false, é representado por somente um bit sendo assim é este o espaço que é utilizado na memória para variáveis deste tipo, sua representação binária ficaria:

1 = true

0 = false

Tipo Integer (inteiro)

Como o nome diz, este tipo de dados se refere a números inteiros, sejam eles positivos ou negativos, seu tamanho em memória pode variar de 2 bits até 32 ou 64 bits, a depender do processador em uso.

O PHP trabalha suporta somente inteiros com sinal, isso quer dizer que o primeiro bit da palavra binária representa o sinal do número (positivo ou negativo).

O valor máximo de uma variável deste tipo de dados depende da plataforma onde o código está sendo executado, para um ambiente 32 bits o valor máximo para este tipo de dados é algo em torno de 2.147.483.647 (0111 1111 1111 1111 1111 1111 1111 1111) e o mínimo próximo a -2.147.483.647 (1111 1111 1111 1111 1111 1111 1111 1111), estes limites se aplicam não só ao processamento, como também o armazenamento (o google que o diga).

Overflow

Um overflow é um estouro, ou seja, quando um número (geralmente operação aritmética) não cabe no espaço reservado para ele pelo tipo de dados definido, no PHP o tipo da variável é definido no momento em que esta variável recebe o valor (falaremos mais sobre isso no próximo post), então quando ocorre um overflow para uma variável do tipo inteiro, esta é automaticamente transformada em ponto flutuante (float), porém deve-se tomar cuidado, pois mesmo o PHP realizando esta transformação na variável, podem ocorrer erros na hora de persistir os dados.

Float ou Double

Os floats/ doubles, são os números reais, ou seja, números que podem conter casas decimais, utilizado na maioria dos casos onde se trabalha com porcentagens, divisões e valores monetários, fornecem precisão aos cálculos, assim como os inteiros seu valor máximo depende do ambiente onde o PHP está sendo executado, sendo seu valor máximo ~1.8e308 e seu mínimo ~-1.8e308, com uma precisão de 14 dígitos (após vírgula) em sistemas 64 bits.

Em PHP, assim como nas demais linguagens de programação, usa-se como separador de decimais o “.” (ponto).

Quando trabalhamos com números de ponto flutuante precisamos tomar certo cuidado com os valores, principalmente se os valores forem críticos, pois nem todo valor real possui representação binária, são exemplos disso 0.1 e 0.7, o que pode causar certas diferenças em cálculos ou na hora da persistência de dados.

Por exemplo:

Se realizarmos o cálculo sugerido no manual do PHP:

<?php echo floor((0.1+0.7) * 10);

 

O comando acima mostra um arredondamento para baixo (usando a função floor) do cálculo informado. Como  resultado  teremos 7, ao invés de 8, que seria o resultado esperado. Isso aconteceu  por que tanto 0.1 quanto 0.7 não tem representação binária, sendo assim o cálculo realizado pelo processador foi na realidade:

(0.10000000000000000555 + 0.69999999999999995559) * 10 = 7.99999999999999911182

Quando arredondamos para baixo o valor o mesmo vai para 7 ao invés de 8, agora imaginemos este comportamento em 10 transações financeiras por dia durante um mês, para resolver este tipo de problema algumas linguagens de programação tem classes ou bibliotecas que conseguem controlar melhor este comportamento, é o caso da biblioteca BCMath no PHP ou BigDecimals em Java .

Uma material interessante a respeito pode ser encontrado neste link (em inglês).

String

Uma string é uma sequência de caracteres, um caractere é uma letra, número ou símbolo, até última versão do PHP 5 ele ocupa exatamente 1 byte na memória, ou seja, não há um suporte nativo ao Unicode.. O tamanho de uma string é o espaço disponível em memória para a execução do PHP. (para saber qual é este espaço ou como alterá-lo, consulte este post).

Array

Atualmente, um array é considerado pela documentação do PHP um mapa ordenado, é considerado assim por permitir que um valor seja associado a uma chave. Na prática um array é uma coleção de objetos, no caso do PHP podem ser do mesmo tipo ou não, o array pode ser unidimensional (uma lista), bidimensional (pode ser comparado a uma tabela de uma planilha) ou multidimensional o qual pode ter “n” ramificações, visto que cada posição de um array pode ter como valor outro array.

O PHP trabalha com arrays associativos, sendo assim podemos ter como uma chave para a posição do array um valor qualquer que o associa ao elemento, isso é útil para criarmos hashtables (Armazena os dados com pares de valores, chave e valor, e utiliza a chave para obter o valor armazenado na tabela).

O limite para este tipo de dados, assim como a string, é o espaço disponível em memória para execução do PHP.

Objeto

Um objeto é uma instância de uma classe, ou seja, uma variável com este tipo de dados irá armazenar uma espécie de “cópia” de uma classe, a qual receberá seus próprios atributos.

Ex.:

<?php 
$data = new DateTime();

 

O exemplo acima armazena um objeto DateTime na variável $data.

 

Resource

É um tipo especial de dados, o qual armazena uma referência a um recurso externo, como um manipulador de arquivos, ou uma conexão ao banco de dados.

Funções especiais criam e utilizam este tipo especial de dados.

Alguns exemplos de função que podem criar este tipo de dados:

fopen()

mysqli_connect()

NULL

Um tipo de dados null é uma variável vazia, ele pode ocorrer quando a variável recebe o valor null,  não recebeu nenhum valor ainda ou foi utilizado o unset(), que elimina a variável da memória.

 

Bom, estes são os tipos de dados possíveis para o PHP, é importante termos algum conhecimento destes tipos para que possamos evitar problemas como os relatados no tipo float, por exemplo.
Espero que o post tenha ajudado, se sim, compartilhe, pode ser útil para mais alguém.

Sobre Rodrigo Teixeira Andreotti

Técnico em Informática formado pela ETEC Lauro Gomes Analista de Sistemas Pela universidade Metodista. Impacta Certified Specialist - Linux Programador PHP desde 2007, atuando em diversos projetos de sistemas internos, migrações, desenvolvimento de API's e sites públicos tanto como freelancer quanto com contrato com empresas. Também atuante como administrador Linux, administrando dois servidores próprios com CentOS, além de prestar serviços de administração e manutenção em servidores para algumas empresas.



Tutorial PHP: Tipos de Dados

Tutorial PHP: Tipos de Dados

Assim como outras linguagens de programação, no PHP também temos que lidar com os tipos de dados então antes de avançarmos para a parte de variáveis, precisamos entender melhor como isso funciona para termos uma maior controle sobre nosso código.

Porém, antes de falar dos tipos de dados do PHP precisamos entender melhor como o computador trabalha com esta informação, vejamos abaixo uma breve explicação:

Linguagem Binária

Tudo no computador acontece através de pulsos elétricos, estes pulsos podem estar “ligados” ou “desligados”, os quais são representados por 0 e 1, a isso chamados de linguagem binária.

Cada pulso elétrico representado pelos algarismos 0 e 1 recebe o nome de bit, e são nestes bits que são representados tanto os dados a serem processados, quanto as instruções do que deve ser feito com estes dados.

Os microprocessadores possuem uma memória interna chamada registrador, esses registradores são o nível mais alto na hierarquia da memória, ou seja, são as mais rápidas e mais caras de todas, por isso, a quantidade desses registradores é bem limitada.

Estes registradores são usados pelo processador para armazenamento da informação enquanto esta é processada, enquanto um programa está em execução, as instruções contidas na memória principal são movidas para os registradores, onde ficam até que sejam concluídas e depois voltam para a memória principal.

 

Palavra binária

Quando falamos em binário, se juntamos vários bits a fim de formar algo inteligível para nós, a este conjunto de bits damos o nome de palavra binária.

Um agrupamento de bits é chamado de BYTE e tem um tamanho (por definição) de 8 bits, podendo representar até (2 elevado a 8) o valor de 256 (em decimal).

Nos processadores modernos são usados agrupamentos de 32 bits, chamados de “palavra” e “palavra dubla” nos de 64 bits. Com isso, além de representar números cada vez maiores, os processadores também conseguiram endereçar um número maior de posições de memória (física), desde os 4 GBytes (4 trilhões) em processadores de 32 bits, para um número astronômico em processadores de 64 bits (tente calcular 2 elevado a 64).

Por exemplo:

Número 2 → 10 (palavra binária que representa o número 2)

Número 4 → 0100

Pausa para piadinha velha: Existem 10 tipos de pessoas, as que entendem binário e as que não entendem binário

De volta a programação

Observe que para cada número inteiro temos uma representação binária, o mesmo acontece para números reais (em programação chamado de número de ponto flutuante, este precisaremos voltar aos binários daqui a pouco), letras, palavras etc.

Voltando aos tipos de dados

E neste ponto chegamos a parte que nos remete aos tipos de dados, pois conforme dito acima, tudo é representado por palavras binárias, e como tal, ocupam um espaço na memória principal do computador, e também no processador durante a execução da instrução, o que vai definir quanto de espaço será reservado para este conteúdo é justamente o tipo de dados, no PHP os tipos de dados possíveis são:

Tipos primitivos

  • Escalares
    • boolean
    • integer
    • float ou double
    • string
  • Compostos
    • array
    • object
  • Especiais
    • resource
    • NULL

Abaixo uma descrição um pouco mais detalhada:

Tipo Boolean

Só recebe dois valores true ou false, é representado por somente um bit sendo assim é este o espaço que é utilizado na memória para variáveis deste tipo, sua representação binária ficaria:

1 = true

0 = false

Tipo Integer (inteiro)

Como o nome diz, este tipo de dados se refere a números inteiros, sejam eles positivos ou negativos, seu tamanho em memória pode variar de 2 bits até 32 ou 64 bits, a depender do processador em uso.

O PHP trabalha suporta somente inteiros com sinal, isso quer dizer que o primeiro bit da palavra binária representa o sinal do número (positivo ou negativo).

O valor máximo de uma variável deste tipo de dados depende da plataforma onde o código está sendo executado, para um ambiente 32 bits o valor máximo para este tipo de dados é algo em torno de 2.147.483.647 (0111 1111 1111 1111 1111 1111 1111 1111) e o mínimo próximo a -2.147.483.647 (1111 1111 1111 1111 1111 1111 1111 1111), estes limites se aplicam não só ao processamento, como também o armazenamento (o google que o diga).

Overflow

Um overflow é um estouro, ou seja, quando um número (geralmente operação aritmética) não cabe no espaço reservado para ele pelo tipo de dados definido, no PHP o tipo da variável é definido no momento em que esta variável recebe o valor (falaremos mais sobre isso no próximo post), então quando ocorre um overflow para uma variável do tipo inteiro, esta é automaticamente transformada em ponto flutuante (float), porém deve-se tomar cuidado, pois mesmo o PHP realizando esta transformação na variável, podem ocorrer erros na hora de persistir os dados.

Float ou Double

Os floats/ doubles, são os números reais, ou seja, números que podem conter casas decimais, utilizado na maioria dos casos onde se trabalha com porcentagens, divisões e valores monetários, fornecem precisão aos cálculos, assim como os inteiros seu valor máximo depende do ambiente onde o PHP está sendo executado, sendo seu valor máximo ~1.8e308 e seu mínimo ~-1.8e308, com uma precisão de 14 dígitos (após vírgula) em sistemas 64 bits.

Em PHP, assim como nas demais linguagens de programação, usa-se como separador de decimais o “.” (ponto).

Quando trabalhamos com números de ponto flutuante precisamos tomar certo cuidado com os valores, principalmente se os valores forem críticos, pois nem todo valor real possui representação binária, são exemplos disso 0.1 e 0.7, o que pode causar certas diferenças em cálculos ou na hora da persistência de dados.

Por exemplo:

Se realizarmos o cálculo sugerido no manual do PHP:

<?php echo floor((0.1+0.7) * 10);

 

O comando acima mostra um arredondamento para baixo (usando a função floor) do cálculo informado. Como  resultado  teremos 7, ao invés de 8, que seria o resultado esperado. Isso aconteceu  por que tanto 0.1 quanto 0.7 não tem representação binária, sendo assim o cálculo realizado pelo processador foi na realidade:

(0.10000000000000000555 + 0.69999999999999995559) * 10 = 7.99999999999999911182

Quando arredondamos para baixo o valor o mesmo vai para 7 ao invés de 8, agora imaginemos este comportamento em 10 transações financeiras por dia durante um mês, para resolver este tipo de problema algumas linguagens de programação tem classes ou bibliotecas que conseguem controlar melhor este comportamento, é o caso da biblioteca BCMath no PHP ou BigDecimals em Java .

Uma material interessante a respeito pode ser encontrado neste link (em inglês).

String

Uma string é uma sequência de caracteres, um caractere é uma letra, número ou símbolo, até última versão do PHP 5 ele ocupa exatamente 1 byte na memória, ou seja, não há um suporte nativo ao Unicode.. O tamanho de uma string é o espaço disponível em memória para a execução do PHP. (para saber qual é este espaço ou como alterá-lo, consulte este post).

Array

Atualmente, um array é considerado pela documentação do PHP um mapa ordenado, é considerado assim por permitir que um valor seja associado a uma chave. Na prática um array é uma coleção de objetos, no caso do PHP podem ser do mesmo tipo ou não, o array pode ser unidimensional (uma lista), bidimensional (pode ser comparado a uma tabela de uma planilha) ou multidimensional o qual pode ter “n” ramificações, visto que cada posição de um array pode ter como valor outro array.

O PHP trabalha com arrays associativos, sendo assim podemos ter como uma chave para a posição do array um valor qualquer que o associa ao elemento, isso é útil para criarmos hashtables (Armazena os dados com pares de valores, chave e valor, e utiliza a chave para obter o valor armazenado na tabela).

O limite para este tipo de dados, assim como a string, é o espaço disponível em memória para execução do PHP.

Objeto

Um objeto é uma instância de uma classe, ou seja, uma variável com este tipo de dados irá armazenar uma espécie de “cópia” de uma classe, a qual receberá seus próprios atributos.

Ex.:

<?php 
$data = new DateTime();

 

O exemplo acima armazena um objeto DateTime na variável $data.

 

Resource

É um tipo especial de dados, o qual armazena uma referência a um recurso externo, como um manipulador de arquivos, ou uma conexão ao banco de dados.

Funções especiais criam e utilizam este tipo especial de dados.

Alguns exemplos de função que podem criar este tipo de dados:

fopen()

mysqli_connect()

NULL

Um tipo de dados null é uma variável vazia, ele pode ocorrer quando a variável recebe o valor null,  não recebeu nenhum valor ainda ou foi utilizado o unset(), que elimina a variável da memória.

 

Bom, estes são os tipos de dados possíveis para o PHP, é importante termos algum conhecimento destes tipos para que possamos evitar problemas como os relatados no tipo float, por exemplo.
Espero que o post tenha ajudado, se sim, compartilhe, pode ser útil para mais alguém.

Sobre Rodrigo Teixeira Andreotti

Técnico em Informática formado pela ETEC Lauro Gomes Analista de Sistemas Pela universidade Metodista. Impacta Certified Specialist - Linux Programador PHP desde 2007, atuando em diversos projetos de sistemas internos, migrações, desenvolvimento de API's e sites públicos tanto como freelancer quanto com contrato com empresas. Também atuante como administrador Linux, administrando dois servidores próprios com CentOS, além de prestar serviços de administração e manutenção em servidores para algumas empresas.