Menu

Tipos de dados PHP: int, float, string, bool, array, null

O PHP tem dez tipos: quatro escalares (int, float, string, bool), quatro compostos (array, object, callable, iterable) e dois especiais (null, resource). var_dump($x) mostra o tipo e o valor, gettype($x) retorna o nome do tipo.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

O PHP tem oito tipos que você usa todo dia: int, float, string, bool, array, object, null, mais callable para funções que você passa adiante. Uma variável não tem tipo fixo; o valor atual dela tem. var_dump($x) mostra o tipo e o valor, e gettype($x) retorna o tipo como string.

A primeira coluna é gettype(), a segunda get_debug_type(). Troque um valor por um seu e rode de novo. As duas discordam em alguns nomes: gettype diz integer, double e boolean por razões históricas, enquanto get_debug_type usa os nomes das declarações de tipo (int, float, bool) e dá o nome da classe para um objeto.

Os tipos do PHP num relance

TipoExemploObservações
int42, -7, 0x1A, 1_000_000números inteiros, 64 bits em sistemas modernos
float3.14, 1.5e3decimais, inexatos como em qualquer linguagem
string"hi", 'hi'uma sequência de bytes, não de caracteres
booltrue, falsenão diferencia maiúsculas (TRUE também funciona)
array[1, 2], ["a" => 1]mapa ordenado: lista e dicionário num só
objectnew User(), new stdClass()uma instância de uma classe
nullnullo único valor do tipo null; também "nenhum valor definido"
callable'strlen', fn($x) => $x * 2qualquer coisa que pode ser chamada
iterableum array ou um objeto Traversableo que o foreach aceita
resourceo resultado de fopen()um handle para algo fora do PHP

Inspecionar valores com var_dump

var_dump é a ferramenta para ver o que você realmente tem. Ele imprime o tipo, o valor e, para strings, o tamanho em bytes:

echo imprimiria 10 para os três primeiros e esconderia a diferença. O tamanho em string(5) "café" conta bytes, e é por isso que strlen e mb_strlen diferem em texto fora do ASCII.

Inteiros e floats

Um inteiro é um número sem casas decimais. Literais podem usar underscores para facilitar a leitura, e notação hexadecimal, octal e binária. Um float é qualquer número com ponto decimal ou expoente e, como em qualquer linguagem, guarda a maioria dos decimais de forma aproximada:

Nunca compare floats com ==; compare a diferença com uma pequena tolerância, ou arredonde os dois lados antes. Para dinheiro, guarde centavos inteiros como integers.

Booleanos e quais valores são falsos

Um bool é true ou false. Onde o PHP espera uma condição (if, while, !), qualquer valor é convertido para bool, e uma pequena lista de valores conta como falso: false, 0, 0.0, "", "0", [] e null. Todo o resto é verdadeiro. A tabela mostra cada valor com seu tipo, sua conversão para bool e se ele é numérico:

gettype, (bool) e is_numeric para cada valor de $x
Point at or tap a cell to read it as PHP.
$xgettypeboolis_numeric
0
1
-1
0.0
1.5
"0"
""
" "
"0.0"
"10"
"1e1"
"abc"
"null"
true
false
null
[]
[0]
Every cell computed by PHP 8.3.19.

As surpresas são "0.0", " " e "null": as três são strings não vazias diferentes de "0", então são verdadeiras, e if ($value) executa o bloco para elas.

Arrays, objetos e null

Um array guarda qualquer mistura de valores sob chaves inteiras ou string. Um objeto é uma instância de uma classe; stdClass é a classe vazia do PHP para objetos rápidos, e (object) transforma um array num objeto. null significa "nenhum valor":

Verificar um tipo com as funções is_*

Cada tipo tem uma função de teste que retorna true ou false. is_numeric é diferente de is_int: ela aceita strings numéricas também, que é o que você quer ao verificar dados de formulário.

Outras: is_bool, is_array, is_object, is_null, is_callable, is_iterable, e $x instanceof ClassName para uma classe específica.

Conversão automática e strict types

O PHP converte tipos automaticamente quando um operador precisa de outro tipo. Uma string numérica usada em aritmética vira número, e . transforma números em strings. Uma string que não é numérica de jeito nenhum não pode ser somada, e o PHP 8 lança um TypeError:

Parâmetros tipados também convertem, a menos que o arquivo comece com declare(strict_types=1);. Aí uma chamada com o tipo escalar errado falha em vez de ser convertida:

Para converter de propósito, faça um cast: (int) "42", (float) "3.5", (string) 10, (bool) "0". A página sobre conversão de tipos cobre todos os casts e seus casos extremos.

Erro comum: comparar tipos diferentes com ==

Como o == converte antes de comparar, dois valores de tipos diferentes podem ser "iguais" de formas que causam bugs, como "1e1" == "10" (os dois são o número 10) ou null == false. Use ===, que também exige o mesmo tipo, a menos que você queira a conversão:

O PHP 8 corrigiu o pior caso: "abc" == 0 era true e agora é false, porque uma string não numérica é comparada como string. As tabelas completas estão na página sobre operadores de comparação.

Perguntas frequentes

Como verifico o tipo de uma variável no PHP?

var_dump($x) imprime o tipo e o valor, por exemplo int(5). gettype($x) retorna o nome do tipo como string ("integer"), e get_debug_type($x) retorna o nome moderno ("int", ou o nome da classe para objetos). Para testar um tipo específico, use is_int, is_string, is_array e as outras funções is_*.

Por que gettype retorna "double" para um float?

Por razões históricas, gettype() informa floats como "double" e inteiros como "integer". get_debug_type(), adicionada no PHP 8, retorna "float" e "int", os mesmos nomes que você escreve nas declarações de tipo.

Quais valores são falsos no PHP?

Convertidos para bool, estes são false: false, 0, 0.0, "", "0", [] e null. Todo o resto é true, incluindo "0.0", " " e "false".

Qual é o maior inteiro no PHP?

PHP_INT_MAX, que vale 9223372036854775807 em sistemas de 64 bits. Passar desse valor não dá a volta: o resultado vira float e perde precisão.

O PHP é fortemente ou fracamente tipado?

O PHP tem tipagem dinâmica e, por padrão, converte tipos quando consegue ("10" + 5 é 15). Com declare(strict_types=1); no topo de um arquivo, as chamadas a funções tipadas naquele arquivo rejeitam tipos escalares errados com um TypeError em vez de convertê-los.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR