php-variables-y-constantes-en-php

Variables y constantes en PHP

  • 4 min

Una variable es un espacio identificado en el que almacenamos un valor que puede cambiar durante la ejecución.

En cualquier lenguaje de programación, necesitas “cajas” para guardar datos. En PHP, esas cajas son las variables y las constantes.

Aunque parezca trivial, la forma en que PHP maneja estas cajas (y sobre todo, desde dónde puedes verlas) es única. Entender esto ahora te ahorrará horas de depuración en el futuro.

Las variables: el signo del dólar

En PHP, todas las variables empiezan con el signo de dólar $. Sin excepciones.

$nombre = "Luis";
$edad = 35;
$precio = 10.50;
$es_programador = true;
Copied!

Reglas de etiqueta (naming conventions)

Aunque PHP te deja llamar a tus variables como quieras (mientras empiecen por letra o guion bajo), conviene aplicar una convención consistente:

  • Usa camelCase para variables normales: $miVariableFavorita.
  • El nombre debe ser descriptivo (evita $x, $y, $data).
  • Case Sensitive: $edad y $Edad son dos variables distintas.

¿Dónde está el tipo?

PHP es un lenguaje de tipado dinámico. Esto significa que no necesitas decirle “esto es un entero” al crear la variable. PHP lo infiere por el valor que le asignas.

$var = 10;      // Ahora es un int
$var = "Hola";  // Ahora es un string (¡PHP lo permite!)
Copied!

Aunque PHP permite cambiar el tipo de una variable al vuelo, en el desarrollo profesional moderno intentamos evitarlo. Si una variable nace siendo un número, debería morir siendo un número para evitar caos.

El ámbito (scope)

Aquí es donde PHP se comporta diferente a JavaScript o C++. En PHP, las variables tienen ámbito local a la función. Esto significa que hay un “muro” entre lo que pasa fuera de una función y lo que pasa dentro.

Mira este ejemplo:

$mensaje = "Hola mundo"; // Variable Global

function saludar() {
    // Intentamos usar la variable global dentro
    echo $mensaje; 
}

saludar();
Copied!

Resultado: Warning: Undefined variable $mensaje.

¿Por qué? Porque la función saludar() es un entorno estanco. No “ve” lo que hay fuera, a menos que se lo digamos explícitamente.

¿Cómo solucionarlo?

La mejor práctica, la que usaremos el 99% de las veces, es inyectar los datos que la función necesita.

function saludar($texto) {
    echo $texto;
}

saludar($mensaje); // "Hola mundo"
Copied!

Veremos esto a fondo más adelante, pero las funciones flecha o anónimas sí pueden capturar variables externas usando use.

Podrías hacer esto:

function saludar() {
    global $mensaje; // Importamos la variable de fuera
    echo $mensaje;
}
Copied!

Evita usar global. Hace que tu código sea impredecible y difícil de testear. Si una función necesita un dato, pásaselo como argumento.

Constantes: valores inmutables

A veces necesitas guardar un valor que nunca debe cambiar durante la ejecución del script: la URL de la base de datos, el valor de PI, o la ruta de tu carpeta de archivos.

Para esto usamos constantes. Una vez definidas, no se pueden redefinir ni borrar. Y, a diferencia de las variables, no llevan el signo $.

Tenemos dos formas de definirlas. La batalla clásica: define vs const.

Opción a: la función define()

Es la forma “antigua” o en tiempo de ejecución (Run-time).

define('NOMBRE_APP', 'Mi Gran Aplicación');

if (true) {
    define('ESTADO', 'Activo'); // Se puede usar dentro de if
}
Copied!

Opción b: la palabra clave const

Es la forma “moderna” y se procesa en tiempo de compilación (Compile-time). Es más rápida y legible.

const VELOCIDAD_LUZ = 299792458;
// const no se puede usar dentro de un if/bucle directamente
Copied!

¿Cuál debo usar?

Usa const siempre que puedas.

  1. Es más legible.
  2. Es la única forma de definir constantes dentro de Clases (POO).
  3. Es ligeramente más rápido.

Reserva define() solo para casos muy raros donde el nombre de la constante se genera dinámicamente.

Ámbito de las constantes

Las constantes declaradas fuera de una clase están disponibles dentro de las funciones de su espacio de nombres sin usar global. Ten en cuenta que los namespaces forman parte de su nombre, por lo que una constante MiApp\\TASA_IVA no es la misma que una constante global TASA_IVA.

const TASA_IVA = 0.21;

function calcularTotal($precio) {
    // TASA_IVA es visible aquí sin problemas
    return $precio * (1 + TASA_IVA); 
}
Copied!