define() vs const en PHP: la batalla de los titanes para declarar constantes
\n\n¿Alguna vez te has preguntado por qué en PHP existen dos formas distintas de declarar una constante? Parece redundante, ¿verdad? Pero, como siempre, el diablo está en los detalles. Esta pregunta en Stack Overflow ha acumulado miles de visitas, y con razón: la diferencia entre define() y const puede afectar seriamente la arquitectura de tu código.
Hoy vamos a aclarar este tema de una vez por todas. No solo conocerás las diferencias sintácticas, sino también cuándo cada herramienta te da una ventaja real. ¡Allá vamos!
\n\nBreve introducción: ¿qué es una constante en PHP?
\n\nUna constante es un identificador para un valor simple. Su característica principal: el valor no puede modificarse durante la ejecución del script (a diferencia de una variable). Por defecto, las constantes distinguen entre mayúsculas y minúsculas, pero esto se puede configurar (spoiler: con define()).
Ejemplo de una constante clásica:
\n\n<?php\ndefine("MAX_UPLOAD_SIZE", 10485760); // 10 MB en bytes\necho MAX_UPLOAD_SIZE; // 10485760\n?>\n\nLo mismo, pero con const:
<?php\nconst MAX_UPLOAD_SIZE = 10485760;\necho MAX_UPLOAD_SIZE;\n?>\n\nParecen iguales, pero profundicemos.
\n\nDiferencias principales entre define() y const
\n\nVamos a desglosarlo todo. Estas son las diferencias clave que todo desarrollador PHP debe conocer.
\n\n1. Momento de declaración: compilación vs ejecución
\n\nEsta es la diferencia más fundamental.
\n\n- \n
const— se declara en la fase de compilación. Esto significa que no puedes usarconstdentro de bucles, condicionales o funciones. Debe declararse en el «cuerpo» de una clase (para constantes de clase) o en el ámbito global. \n define()— se ejecuta en tiempo de ejecución. Puedes colocarlo en cualquier lugar: dentro de unif,for,while, e incluso en una función (aunque es una mala práctica). \n
Ejemplo que no funcionará con const:
<?php\nif (PHP_OS === 'WINNT') {\n const PLATFORM = 'Windows';\n // Error fatal: No se puede usar const en una estructura de control\n}\n?>\n\nCon define() sí funciona:
<?php\nif (PHP_OS === 'WINNT') {\n define('PLATFORM', 'Windows');\n echo PLATFORM; // Windows\n}\n?>\n\n2. Tipos de datos: arrays y objetos
\n\nDurante mucho tiempo, define() solo soportaba tipos escalares (cadenas, números, booleanos). A partir de PHP 7, define() también acepta arrays.
const también soporta arrays (desde PHP 5.6), pero no soporta objetos ni expresiones:
<?php\n// Funciona desde PHP 7+\ndefine('FRUITS', ['manzana', 'plátano', 'cereza']);\necho FRUITS[1]; // plátano\n\n// También funciona (PHP 5.6+)\nconst COLORS = ['rojo', 'verde', 'azul'];\n\n// ¡Esto da error!\n// const RESULT = 2 + 3; // Funciona, es una expresión constante\n// const DYNAMIC = rand(1, 10); // ¡Error! No es una expresión constante\n?>\n\nImportante: define() puede usar el resultado de funciones (define('SITE_NAME', get_site_name())), mientras que const solo acepta expresiones constantes (números, cadenas, otras constantes).
3. Espacio de nombres y ámbito de visibilidad
\n\nAquí hay un matiz sutil pero importante.
\n\n- \n
define()— siempre crea una constante global. Incluso si lo llamas dentro de un espacio de nombres, la constante será accesible desde cualquier lugar. \n const— respeta las reglas del espacio de nombres. Una constante declarada en el namespaceMyApp\\Configse llamaráMyApp\\Config\\NOMBRE. \n