Para convertir un valor a otro tipo, pon el tipo entre paréntesis delante: (int) "42" da el entero 42. La forma de función intval("42") hace lo mismo. Un cast nunca falla: el texto que no es un número se convierte en 0, y una cadena que empieza por dígitos se queda solo con esos dígitos.
Los casts de PHP son (int), (float), (string), (bool), (array) y (object). Cada uno tiene también una función: intval(), floatval(), strval(), boolval().
De string a int: qué devuelven (int) e intval()
PHP lee los dígitos desde el principio de la cadena, tras saltarse los espacios iniciales, y se detiene en el primer carácter que no encaja en un número. La notación con exponente cuenta como número; el prefijo 0x, no.
Fíjate en que "12.7" se convierte en 12: convertir a int corta la parte decimal, no redondea. Ni (int) ni intval() imprimen un warning aquí, sea cual sea la entrada.
intval() con base
intval($value, $base) lee la cadena en otro sistema de numeración. Con base 0, PHP mira el prefijo: 0x para hexadecimal, 0b para binario y un 0 inicial para octal.
De float a int: truncar, no redondear
(int) descarta todo lo que hay tras el punto decimal, hacia cero. Redondea antes si quieres el entero más cercano, y cuidado con los paréntesis:
La última pareja es la trampa clásica de los floats: (0.1 + 0.7) * 10 se guarda como 7.999999..., así que truncar da 7. Redondear primero da 8. La página de matemáticas explica round, floor y ceil.
Convertir a bool, string y array
A bool, solo unos pocos valores se convierten en false: 0, 0.0, "", "0", null y []. Todo lo demás es true, incluidos "0.0", " " y "false".
A string, true se convierte en "1", mientras que false y null se convierten los dos en "". Los floats pierden un .0 final, y los floats muy grandes o muy pequeños usan notación con exponente.
Convertir un array a cadena no lo une. Esto imprime Tags: Array:
<?php
$tags = ["php", "web"];
echo "Tags: " . $tags;
y PHP añade un warning:
Warning: Array to string conversion in /home/index.php on line 3
Usa implode(", ", $array) o json_encode($array) para convertir un array en texto.
Todos los casts de un vistazo
Elige un valor para ver qué devuelven intval, (bool), strval, is_numeric y gettype con él. Cada celda la calculó PHP 8.3.
| $x | intval | bool | strval | is_numeric | gettype |
|---|---|---|---|---|---|
| "10" | |||||
| "1abc" | |||||
| "abc" | |||||
| "" | |||||
| " " | |||||
| "0" | |||||
| "0.0" | |||||
| "1e1" | |||||
| "010" | |||||
| 1.5 | |||||
| true | |||||
| false | |||||
| null | |||||
| [] | |||||
| [1, 2] |
Cadenas numéricas y conversión automática
Una cadena numérica es una cadena que parece un número: "12", "-3.5", "1e3", con espacios opcionales alrededor. PHP las convierte automáticamente en las operaciones aritméticas, y is_numeric() te dice si una cadena lo es.
"12abc" + 1 sigue dando 13, pero PHP 8 imprime Warning: A non-numeric value encountered, y "abc" + 1 lanza un TypeError. Convierte o valida antes de hacer aritmética con la entrada del usuario.
settype() y gettype()
settype() cambia el tipo de una variable en el sitio y gettype() lo indica. get_debug_type() devuelve los nombres más cortos que ves en los mensajes de error (int, float, string).
La mayoría del código usa un cast ($value = (int) $value;), porque es más corto y se lee igual.
Validar la entrada en lugar de convertirla
(int) nunca dice que no, así que (int) "abc" se convierte en silencio en 0 y (int) "5 apples" en 5. Para la entrada de formularios, usa filter_var con FILTER_VALIDATE_INT: devuelve el entero o false.
Compara el resultado con === false, porque 0 es un entero válido y == false lo rechazaría. La página de filter_var muestra rangos y otros validadores.
Preguntas frecuentes
¿Cómo convierto una cadena en un int en PHP?
Usa (int) $str o intval($str); en base 10 los dos dan el mismo resultado. (int) "42" es 42, (int) "12abc" es 12 y (int) "abc" es 0. Para rechazar una entrada que no sea un número entero, usa filter_var($str, FILTER_VALIDATE_INT), que devuelve false en lugar de adivinar.
¿Cuál es la diferencia entre intval() y (int) en PHP?
En base 10 devuelven el mismo resultado. intval() además acepta una base: intval('ff', 16) es 255, y con base 0 lee prefijos como 0x, 0b y un 0 inicial para octal. Al ser una función, intval también se puede pasar como callback, como en array_map('intval', $values).
¿Qué devuelve (bool) "0" en PHP?
false. La cadena "0" es uno de los valores falsy de PHP, junto con "", 0, 0.0, null y []. Cualquier otra cadena es true, incluidas "0.0", " " y "false".
¿Cómo convierto un número en cadena en PHP?
Usa (string) $n, strval($n) o mételo en una cadena: "$n". (string) 3.0 es "3"; para un número fijo de decimales usa number_format($n, 2) o sprintf('%.2f', $n).