Menu

Tipos de datos en PHP: int, float, string, bool, array, null

PHP tiene diez tipos: cuatro escalares (int, float, string, bool), cuatro compuestos (array, object, callable, iterable) y dos especiales (null, resource). var_dump($x) muestra el tipo y el valor, y gettype($x) devuelve el nombre del tipo.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

PHP tiene ocho tipos que usas a diario: int, float, string, bool, array, object, null, más callable para las funciones que pasas de un sitio a otro. Una variable no tiene un tipo fijo; lo tiene su valor actual. var_dump($x) muestra el tipo y el valor, y gettype($x) devuelve el tipo como cadena.

La primera columna es gettype() y la segunda get_debug_type(). Cambia un valor por uno tuyo y vuelve a ejecutarlo. Difieren en algunos nombres: gettype dice integer, double y boolean por razones históricas, mientras que get_debug_type usa los nombres de las declaraciones de tipo (int, float, bool) y da el nombre de la clase en un objeto.

Los tipos de PHP de un vistazo

TipoEjemploNotas
int42, -7, 0x1A, 1_000_000números enteros, de 64 bits en sistemas modernos
float3.14, 1.5e3decimales, inexactos como en cualquier lenguaje
string"hi", 'hi'una secuencia de bytes, no de caracteres
booltrue, falseno distingue mayúsculas (TRUE también funciona)
array[1, 2], ["a" => 1]mapa ordenado: lista y diccionario en uno
objectnew User(), new stdClass()una instancia de una clase
nullnullel único valor del tipo null; también significa "sin valor asignado"
callable'strlen', fn($x) => $x * 2cualquier cosa que se pueda llamar
iterableun array o un objeto Traversablelo que acepta foreach
resourceel resultado de fopen()un manejador de algo externo a PHP

Inspeccionar valores con var_dump

var_dump es la herramienta para ver lo que tienes de verdad. Imprime el tipo, el valor y, en las cadenas, la longitud en bytes:

echo imprimiría 10 para los tres primeros y ocultaría la diferencia. La longitud en string(5) "café" cuenta bytes, y por eso strlen y mb_strlen dan resultados distintos con texto no ASCII.

Enteros y floats

Un entero es un número sin decimales. Los literales pueden usar guiones bajos para leerse mejor, y notación hexadecimal, octal y binaria. Un float es cualquier número con punto decimal o exponente, y como en cualquier lenguaje guarda la mayoría de los decimales de forma aproximada:

Nunca compares floats con ==; compara la diferencia con una tolerancia pequeña, o redondea antes los dos lados. Para dinero, guarda céntimos enteros como integers.

Booleanos y qué valores son false

Un bool es true o false. Donde PHP espera una condición (if, while, !), cualquier valor se convierte a bool, y una lista corta de valores cuenta como false: false, 0, 0.0, "", "0", [] y null. Todo lo demás es true. La tabla muestra cada valor con su tipo, su conversión a bool y si es 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.

Las sorpresas son "0.0", " " y "null": las tres son cadenas no vacías distintas de "0", así que son true, y if ($value) ejecuta su cuerpo con ellas.

Arrays, objetos y null

Un array guarda cualquier mezcla de valores bajo claves enteras o de texto. Un objeto es una instancia de una clase; stdClass es la clase vacía de PHP para objetos rápidos, y (object) convierte un array en uno. null significa "sin valor":

Comprobar un tipo con las funciones is_*

Cada tipo tiene una función de comprobación que devuelve true o false. is_numeric es distinta de is_int: también acepta cadenas numéricas, que es lo que quieres al validar datos de un formulario.

Otras: is_bool, is_array, is_object, is_null, is_callable, is_iterable, y $x instanceof ClassName para una clase concreta.

Conversión automática de tipos y strict types

PHP convierte los tipos automáticamente cuando un operador necesita otro distinto. Una cadena numérica usada en aritmética se convierte en número, y . convierte los números en cadenas. Una cadena que no es numérica en absoluto no se puede sumar, y PHP 8 lanza un TypeError:

Los parámetros tipados también convierten, salvo que el archivo empiece por declare(strict_types=1);. Entonces una llamada con un tipo escalar incorrecto falla en lugar de convertirse:

Para convertir a propósito, haz un cast: (int) "42", (float) "3.5", (string) 10, (bool) "0". La página de conversión de tipos explica cada cast y sus casos límite.

Error frecuente: comparar tipos distintos con ==

Como == convierte antes de comparar, dos valores de tipos distintos pueden ser "iguales" de formas que causan bugs, como "1e1" == "10" (los dos son el número 10) o null == false. Usa ===, que además exige el mismo tipo, salvo que quieras la conversión:

PHP 8 corrigió el peor caso: "abc" == 0 antes era true y ahora es false, porque una cadena no numérica se compara como cadena. Las tablas completas están en la página de operadores de comparación.

Preguntas frecuentes

¿Cómo compruebo el tipo de una variable en PHP?

var_dump($x) imprime el tipo y el valor, por ejemplo int(5). gettype($x) devuelve el nombre del tipo como cadena ("integer"), y get_debug_type($x) devuelve el nombre moderno ("int", o el nombre de la clase en los objetos). Para comprobar un tipo concreto, usa is_int, is_string, is_array y las demás funciones is_*.

¿Por qué gettype devuelve "double" para un float?

Por razones históricas, gettype() informa de los floats como "double" y de los enteros como "integer". get_debug_type(), añadida en PHP 8, devuelve "float" e "int", los mismos nombres que escribes en las declaraciones de tipo.

¿Qué valores son false en PHP?

Convertidos a bool, estos son false: false, 0, 0.0, "", "0", [] y null. Todo lo demás es true, incluidos "0.0", " " y "false".

¿Cuál es el entero máximo en PHP?

PHP_INT_MAX, que vale 9223372036854775807 en sistemas de 64 bits. Si sumas por encima de él no vuelve a empezar desde abajo: el resultado se convierte en un float y pierde precisión.

¿PHP es de tipado fuerte o débil?

PHP tiene tipado dinámico y, por defecto, convierte los tipos cuando puede ("10" + 5 es 15). Con declare(strict_types=1); al principio de un archivo, las llamadas a funciones tipadas de ese archivo rechazan tipos escalares incorrectos con un TypeError en lugar de convertirlos.

Ilustración de los lenguajes de programación de Coddy

Aprende a programar con Coddy

COMENZAR