Type Casting y Type Juggling
PHP es un lenguaje de tipado dinámico, lo que significa que las variables pueden cambiar de tipo durante la ejecución. Entender cómo PHP maneja estas conversiones es crucial para evitar bugs sutiles.
Type Juggling (conversión automática)
PHP convierte tipos automáticamente según el contexto. Esto se llama type juggling o type coercion.
<?php
// En operaciones aritméticas, los strings se convierten a números
$resultado = '5' + 3; // 8 (int)
$resultado = '5.5' + 3; // 8.5 (float)
$resultado = '5 euros' + 3; // 8 (int, ignora el texto)
// En contexto de string, los números se convierten a string
$texto = 'Tengo ' . 5 . ' años'; // "Tengo 5 años"
// En contexto booleano
if ("texto") { } // true (string no vacío)
if (0) { } // false (cero)
if ("0") { } // false (string "0" es especial)
if ([]) { } // false (array vacío)
El type juggling causa resultados
inesperados en comparaciones débiles:
0 == "texto" es true,
"10" == "1e1" es true. Por
eso siempre debes usar ===.
Type Casting (conversión explícita)
Puedes forzar la conversión de tipos usando la sintaxis de casting:
<?php
$valor = '42';
// Casting a diferentes tipos
$entero = (int) $valor; // 42
$entero = (integer) $valor; // 42 (alias)
$decimal = (float) $valor; // 42.0
$decimal = (double) $valor; // 42.0 (alias)
$texto = (string) 42; // "42"
$bool = (bool) $valor; // true
$bool = (boolean) $valor; // true (alias)
$array = (array) $valor; // ["42"]
$objeto = (object) ["a" => 1]; // stdClass con propiedad $a = 1
Conversión a entero
<?php
// Desde float (trunca, no redondea)
echo (int) 4.9; // 4
echo (int) -4.9; // -4
// Desde string
echo (int) "42"; // 42
echo (int) "42.9"; // 42
echo (int) "42 años"; // 42 (lee hasta encontrar no-número)
echo (int) "años 42"; // 0 (empieza con texto)
// Desde boolean
echo (int) true; // 1
echo (int) false; // 0
// Desde null
echo (int) null; // 0
Conversión a boolean
<?php
// Valores que se convierten a FALSE
var_dump((bool) 0); // false
var_dump((bool) 0.0); // false
var_dump((bool) ""); // false
var_dump((bool) "0"); // false (¡especial!)
var_dump((bool) []); // false
var_dump((bool) null); // false
// Todo lo demás es TRUE
var_dump((bool) 1); // true
var_dump((bool) -1); // true
var_dump((bool) "texto"); // true
var_dump((bool) "false"); // true (¡es un string no vacío!)
var_dump((bool) [0]); // true (array no vacío)
Funciones de conversión
Además del casting, PHP ofrece funciones para convertir tipos:
<?php
$valor = '42.5';
// Funciones de conversión
$entero = intval($valor); // 42
$decimal = floatval($valor); // 42.5
$texto = strval(42); // "42"
$bool = boolval($valor); // true
// intval() acepta una base
$hex = intval("FF", 16); // 255
$binario = intval("1010", 2); // 10
// settype() modifica la variable original
$numero = '100';
settype($numero, "integer");
var_dump($numero); // int(100)
Strict Types (PHP 7+)
Puedes desactivar el type juggling en funciones
usando declare(strict_types=1):
<?php
declare(strict_types=1);
function sumar(int $a, int $b): int
{
return $a + $b;
}
echo sumar(5, 3); // 8 ✓
// Sin strict_types, esto funcionaría (convertiría "5" a 5)
// Con strict_types, lanza TypeError
echo sumar("5", 3); // TypeError!
Usa
declare(strict_types=1) en
todos tus archivos PHP. Te obligará a
ser explícito con los tipos y detectarás
errores antes de que lleguen a
producción.
Casos prácticos
Sanitizar entrada de usuario
<?php
// Los datos de formularios siempre son strings
$edad = $_POST['edad'] ?? ''; // "25" o ""
// Convertir a entero de forma segura
$edadInt = (int) $edad;
// O validar primero
if (is_numeric($edad)) {
$edadInt = (int) $edad;
} else {
$edadInt = 0; // o lanzar error
}
// Para IDs y cantidades, asegurar que sea positivo
$id = max(0, (int) $_GET['id']);
Trabajar con APIs JSON
<?php
$json = '{"id": "123", "active": "true", "price": "19.99"}';
$data = json_decode($json, true);
// Los valores vienen como strings, convertir según necesidad
$id = (int) $data['id']; // 123
$activo = $data['active'] === 'true'; // true (no usar (bool)!)
$precio = (float) $data['price']; // 19.99
Errores comunes
<?php
// ERROR: Convertir "false" a boolean
$valor = 'false';
if ((bool) $valor) {
echo 'Esto se ejecuta!'; // "false" es un string no vacío = true
}
// CORRECTO:
if ($valor === 'true') {
// ...
}
// ERROR: Asumir que los strings numéricos son seguros
$input = '5e2'; // ¿Es "5e2" o 500?
echo (int) $input; // 5
echo (float) $input; // 500.0 (notación científica)
// ERROR: Comparar diferentes tipos
$id = 0;
$input = 'admin';
if ($id == $input) {
echo '¡Acceso concedido!'; // 0 == "admin" es true!
}
// CORRECTO: Usar comparación estricta
if ($id === $input) {
// Nunca entrará aquí
}
Ejercicios
Ejercicio 1: Convertir entrada de usuario
Simula una entrada de formulario:
$edadInput = "25". Convierte este
string a entero y verifica que la conversion fue
exitosa mostrando el tipo con
gettype().
Ver solucion
<?php
declare(strict_types=1);
$edadInput = '25';
echo "Antes: " . gettype($edadInput) . " - valor: $edadInput\n";
$edad = (int) $edadInput;
echo "Despues: " . gettype($edad) . " - valor: $edad\n";
Ejercicio 2: Conversion a boolean
Crea variables con los valores "0", 0, "" y
"false". Convierte cada una a boolean usando
(bool) y muestra el resultado con
var_dump().
Ver solucion
<?php
declare(strict_types=1);
$stringCero = '0';
$numeroCero = 0;
$stringVacio = '';
$stringFalse = 'false';
echo "\"0\" como bool: ";
var_dump((bool) $stringCero);
echo "0 como bool: ";
var_dump((bool) $numeroCero);
echo "\"\" como bool: ";
var_dump((bool) $stringVacio);
echo "\"false\" como bool: ";
var_dump((bool) $stringFalse);
Ejercicio 3: Calcular precio total
Tienes $precio = "19.99" y
$cantidad = "3" como strings
(simulando datos de un formulario). Convierte
ambos al tipo apropiado y calcula el total.
Ver solucion
<?php
declare(strict_types=1);
$precio = '19.99';
$cantidad = '3';
$precioFloat = (float) $precio;
$cantidadInt = (int) $cantidad;
$total = $precioFloat * $cantidadInt;
echo "Precio: $precioFloat\n";
echo "Cantidad: $cantidadInt\n";
echo "Total: $total\n";
¿Has encontrado un error o tienes una sugerencia para mejorar esta lección?
Escríbenos¡Has completado la sección de Fundamentos!
Ya dominas los bloques básicos de PHP. Ahora aprenderás a controlar el flujo de tu programa con condicionales y bucles.
Continuar a Estructuras de Control