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
| Tipo | Exemplo | Observações |
|---|---|---|
int | 42, -7, 0x1A, 1_000_000 | números inteiros, 64 bits em sistemas modernos |
float | 3.14, 1.5e3 | decimais, inexatos como em qualquer linguagem |
string | "hi", 'hi' | uma sequência de bytes, não de caracteres |
bool | true, false | não diferencia maiúsculas (TRUE também funciona) |
array | [1, 2], ["a" => 1] | mapa ordenado: lista e dicionário num só |
object | new User(), new stdClass() | uma instância de uma classe |
null | null | o único valor do tipo null; também "nenhum valor definido" |
callable | 'strlen', fn($x) => $x * 2 | qualquer coisa que pode ser chamada |
iterable | um array ou um objeto Traversable | o que o foreach aceita |
resource | o 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:
| $x | gettype | bool | is_numeric |
|---|---|---|---|
| 0 | |||
| 1 | |||
| -1 | |||
| 0.0 | |||
| 1.5 | |||
| "0" | |||
| "" | |||
| " " | |||
| "0.0" | |||
| "10" | |||
| "1e1" | |||
| "abc" | |||
| "null" | |||
| true | |||
| false | |||
| null | |||
| [] | |||
| [0] |
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.