Una constante es un nombre para un valor que nunca cambia mientras se ejecuta el script. Declárala con const MAX_USERS = 100; o define('MAX_USERS', 100); y luego usa el nombre a secas, sin $.
Por convención, los nombres de constantes van en UPPER_SNAKE_CASE. Son globales: una constante declarada al principio de un archivo es visible dentro de cualquier función sin global.
define() vs const
Las dos crean una constante, pero actúan en momentos distintos. const se resuelve cuando PHP compila el archivo, y define() se ejecuta como cualquier otra llamada a función.
const | define() | |
|---|---|---|
Dentro de if, bucles, funciones | No | Sí |
| Nombre construido con una variable | No | Sí |
| Constantes de clase | Sí | No |
| El valor puede ser una expresión | Sí, de constantes y literales | Sí, cualquier valor |
| Namespace automático | Sí | No (indica el nombre completo) |
Usa const por defecto, porque es más corta y se comprueba al compilar. Usa define() cuando la constante dependa de una condición o de un nombre calculado.
Las constantes no se pueden cambiar
Asignar un valor a una constante es un error de sintaxis:
<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error: syntax error, unexpected token "=" in /home/index.php on line 3
Definir dos veces la misma constante no es un error, pero PHP imprime un warning y conserva el primer valor:
<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3
Cuando un valor puede estar ya definido (por ejemplo, en un archivo de configuración que se carga más de una vez), compruébalo antes con defined():
Constantes array
Una constante puede contener un array. Puedes leerlo con NAME[key], recorrerlo y pasarlo de un sitio a otro, pero no modificarlo.
Constantes de clase
Dentro de una clase, const declara una constante que pertenece a la clase. Léela con ClassName::NAME desde fuera y con self::NAME o static::NAME desde dentro. Las constantes de clase pueden tener visibilidad, pueden ser final y, desde PHP 8.3, pueden declarar un tipo.
Un grupo de constantes de clase relacionadas como STATUS_NEW y STATUS_PAID suele quedar mejor como un enum, que además impide que circulen valores no válidos.
Constantes mágicas: LINE, FILE, DIR y más
Las constantes mágicas cambian de valor según dónde aparecen. Se rellenan al compilar.
La más usada es __DIR__, el directorio del archivo actual. Construir las rutas de include a partir de ella hace que funcionen sea cual sea el directorio desde el que se arrancó el script: require __DIR__ . '/config.php';. Consulta include y require para ver el patrón completo.
Constantes predefinidas que conviene conocer
PHP define muchas constantes propias. Estas aparecen continuamente:
PHP_EOL es el final de línea del sistema en el que se ejecuta PHP ("\n" en Linux y macOS, "\r\n" en Windows). Está pensado para texto escrito en archivos y en la terminal; en la salida HTML un salto de línea no se ve, así que ahí usa <br>.
Preguntas frecuentes
¿Cuál es la diferencia entre define() y const en PHP?
const es una construcción del lenguaje que se resuelve al compilar el archivo: funciona en el nivel superior y dentro de clases, pero no dentro de if, bucles o funciones. define() es una función que se llama en tiempo de ejecución, así que funciona en cualquier sitio y el nombre se puede construir con una variable, pero no puede declarar constantes de clase.
¿Una constante de PHP puede ser un array?
Sí. Funcionan tanto const COLORS = ['red', 'green']; como define('COLORS', ['red', 'green']);, y lees un elemento con COLORS[0]. El array no se puede modificar después.
¿Cómo compruebo si una constante está definida en PHP?
Usa defined('NAME'), que recibe el nombre como cadena y devuelve true o false. Un patrón habitual es if (!defined('APP_ENV')) { define('APP_ENV', 'production'); }. Para constantes de clase, pasa 'ClassName::NAME'.
¿Qué son las constantes mágicas en PHP?
Constantes cuyo valor depende de dónde se escriben: __LINE__ (línea actual), __FILE__ (ruta completa del archivo), __DIR__ (su directorio), __FUNCTION__, __CLASS__, __METHOD__ y __NAMESPACE__. Se escriben con dos guiones bajos a cada lado y no distinguen mayúsculas y minúsculas.