Sobes.tech
Junior

¿Cómo funciona la tipificación dinámica en PHP?

sobes.tech AI

Respuesta de la IA

PHP es un lenguaje con tipificación dinámica y débil.

  • Tipificación dinámica: El tipo de una variable se determina en tiempo de ejecución en función del valor asignado, y no se declara explícitamente de antemano.
  • Tipificación débil: PHP puede realizar conversiones de tipo implícitas (conversión contextual), lo que a veces puede llevar a comportamientos inesperados al comparar o realizar operaciones entre valores de diferentes tipos.

Ejemplos:

  1. Cambio de tipo de variable:
    <?php
    $variable = 123;    // int
    $variable = "hola"; // string
    $variable = [1, 2]; // array
    ?>
    
  2. Conversión de tipos implícita en comparación:
    <?php
    var_dump(10 == "10"); // bool(true) - la cadena "10" se convierte en número 10
    var_dump(0 == false); // bool(true) - false se convierte en número 0
    var_dump("abc" == 0); // bool(true) - la cadena "abc" se convierte en número 0, ya que no comienza con un número
    ?>
    
  3. Uso de comparación estricta para evitar conversión implícita:
    <?php
    var_dump(10 === "10"); // bool(false) - se compara tanto en valor como en tipo
    var_dump(0 === false); // bool(false)
    var_dump("abc" === 0); // bool(false)
    ?>
    

Aunque la tipificación dinámica ofrece flexibilidad y acelera el desarrollo en las primeras etapas, puede llevar a errores que solo se detectan en tiempo de ejecución. Para mejorar la fiabilidad del código, en PHP 7+ se introdujeron declaraciones de tipos (type declarations) y modo estricto de tipos (strict types).

<?php
declare(strict_types=1); // Activa el modo estricto de tipos para el archivo actual

function sum(int $a, int $b): int { // Declaración de tipos de argumentos y valor de retorno
    return $a + $b;
}

// sum(1, "2"); // Esto provocará un TypeError en modo estricto

?>

Las declaraciones de tipos y el modo estricto permiten realizar comprobaciones de tipos en la etapa de análisis estático o en tiempo de ejecución antes de llamar a la función, lo que contribuye a escribir código más predecible y mantenible.