Superglobales de PHP

En PHP existen varias variables superglobales que están siempre disponibles en cualquier parte del script. Todas comienzan con $_.

Variable Descripción Ejemplo
$_GET Datos enviados por la URL (query string). $_GET['id']
$_POST Datos enviados por formularios con método POST. $_POST['usuario']
$_REQUEST Combina $_GET, $_POST y $_COOKIE. $_REQUEST['dato']
$_COOKIE Acceso a cookies enviadas por el navegador. $_COOKIE['idioma']
$_SESSION Variables de sesión (requiere session_start()). $_SESSION['user_id']
$_FILES Archivos subidos mediante formularios. $_FILES['foto']['name']
$_SERVER Información del servidor y de la petición. $_SERVER['REQUEST_METHOD']
$_ENV Variables de entorno del sistema o PHP. $_ENV['PATH']
$GLOBALS Contiene todas las variables globales en un array. $GLOBALS['miVar']

Superglobal $_GET[...]

La superglobal $_GET se utiliza en PHP para acceder a los datos que se envían en la URL después del signo ?. Es muy común usarla para pasar parámetros entre páginas, como identificadores de usuario, artículos, filtros de búsqueda, etc.

Características principales

Ejemplo de URL con parámetros

pagina.php?usuario=Pablo&edad=30

Variable Valor
$_GET['usuario'] Pablo
$_GET['edad'] 30

Ejemplo de código PHP

<?php
// Capturar valores enviados por GET
$usuario = $_GET['usuario'];
$edad    = $_GET['edad'];

// Mostrar resultados
echo "Usuario: " . $usuario;
echo "Edad: " . $edad;
?>

Ejemplo de enlace con parámetros

<a href="pagina.php?usuario=Ana&edad=25">Ver datos de Ana</a>

Ejemplo de formulario con GET

<form action="pagina.php" method="get">
  <label>Usuario:</label>
  <input type="text" name="usuario">

  <label>Edad:</label>
  <input type="number" name="edad">

  <button type="submit">Enviar</button>
</form>
Volver

Superglobal $_POST[...]

La superglobal $_POST se utiliza en PHP para acceder a los datos que se envían desde un formulario mediante el método POST. Es ideal para enviar información sensible (como contraseñas) porque los datos no se muestran en la URL.

Características principales

Ejemplo de formulario con POST

<form action="pagina.php" method="post">
  <label>Usuario:</label>
  <input type="text" name="usuario">

  <label>Contraseña:</label>
  <input type="password" name="clave">

  <button type="submit">Enviar</button>
</form>

Ejemplo de código PHP

<?php
// Capturar valores enviados por POST
$usuario = $_POST['usuario'];
$clave   = $_POST['clave'];

// Mostrar resultados (nunca mostrar contraseñas en un sistema real)
echo "Usuario: " . $usuario;
echo "Clave: " . $clave;
?>

Tabla comparativa rápida

Aspecto $_GET $_POST
Visibilidad Parámetros visibles en la URL Datos ocultos en el cuerpo de la petición
Uso común Filtros, búsquedas, navegación Formularios de login, registros, carga de datos sensibles
Límite de datos Limitado por la longitud de la URL Permite enviar mucha más información
Volver

Superglobal $_REQUEST[...]

La superglobal $_REQUEST en PHP permite acceder a datos enviados por GET, POST y COOKIE. Es como un contenedor que mezcla esas tres fuentes en un solo array asociativo.

Características principales

Ejemplo de formulario

<form action="pagina.php" method="post">
  <label>Usuario:</label>
  <input type="text" name="usuario">

  <label>Edad:</label>
  <input type="number" name="edad">

  <button type="submit">Enviar</button>
</form>

Ejemplo de código PHP

<?php
// Capturar valores enviados por GET, POST o COOKIE
$usuario = $_REQUEST['usuario'];
$edad    = $_REQUEST['edad'];

echo "Usuario: " . $usuario;
echo "Edad: " . $edad;
?>

Tabla comparativa rápida

Variable Origen de datos Uso recomendado
$_GET Parámetros en la URL Filtros, navegación, búsquedas
$_POST Formulario enviado por POST Datos sensibles, login, registro
$_REQUEST GET + POST + COOKIE Cuando no importa de dónde viene el dato (poco usado en apps seguras)
Volver

La superglobal $_COOKIE permite acceder a las cookies que el navegador envía al servidor. Una cookie es un pequeño archivo de texto que el servidor guarda en el navegador del usuario, y que luego se reenvía automáticamente en cada petición.

Características principales

Ejemplo de crear y leer una cookie

<?php
// Crear una cookie llamada "usuario" con valor "Pablo"
// Expira en 1 hora (3600 segundos)
setcookie("usuario", "Pablo", time() + 3600);

// Leer la cookie (estará disponible en la próxima carga de página)
if (isset($_COOKIE['usuario'])) {
    echo "Bienvenido, " . $_COOKIE['usuario'];
} else {
    echo "No hay cookie de usuario.";
}
?>

Ejemplo práctico de uso

Tabla resumen

Función Ejemplo Descripción
setcookie() setcookie("idioma","es",time()+3600); Crea una cookie llamada idioma con valor es, expira en 1 hora.
$_COOKIE['idioma'] echo $_COOKIE['idioma']; Lee el valor de la cookie idioma.
volver

Superglobal $_SESSION en PHP — Manual Completo

$_SESSION permite guardar datos del usuario en el servidor durante su navegación. A diferencia de las cookies, la información no viaja en cada request: el servidor la relaciona con el usuario mediante un session ID (típicamente en la cookie PHPSESSID).

Recordá: para usar $_SESSION debés llamar a session_start() antes de enviar cualquier salida al navegador.

Iniciar, escribir y leer sesión

<?php
// Iniciar la sesión (debe ir antes de cualquier echo/HTML)
session_start();

// Escribir valores
$_SESSION['user_id'] = 123;
$_SESSION['usuario'] = 'Pablo';
$_SESSION['rol']     = 'admin';

// Leer valores
echo $_SESSION['usuario']; // Pablo
?>

¿Cómo verifico si la sesión está abierta?

1) Con session_status() (recomendado)

<?php
if (session_status() === PHP_SESSION_ACTIVE) {
  echo "La sesión está abierta ✅";
} else {
  echo "No hay sesión activa ❌";
}
?>

2) Comprobando session_id() (tras intentar abrirla)

<?php
session_start();               // intenta abrir/crear sesión
if (session_id() !== "") {
  echo "Hay una sesión activa ✅";
} else {
  echo "No hay sesión activa ❌";
}
?>

3) Revisando si hay variables en $_SESSION

<?php
session_start();
if (!empty($_SESSION)) {
  echo "Sesión abierta y con datos:";
  var_dump($_SESSION);
} else {
  echo "No hay variables en la sesión.";
}
?>

Nota: el método 3 verifica que haya datos guardados, no solo que la sesión exista. Para saber si la sesión está activa, preferí session_status().

Destruir sesión (logout)

<?php
session_start();

// Quitar variables
session_unset();

// Destruir la sesión en el servidor
session_destroy();

// (Opcional) Borrar cookie de sesión en el cliente
if (ini_get("session.use_cookies")) {
  $params = session_get_cookie_params();
  setcookie(session_name(), '', time() - 42000,
    $params["path"], $params["domain"],
    $params["secure"], $params["httponly"]
  );
}

// Redirigir al inicio (opcional)
// header("Location: /");
?>

Buenas prácticas y seguridad

Mini flujo de login (esquema de ejemplo)

<?php
session_start();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $user = $_POST['usuario'] ?? '';
  $pass = $_POST['clave']   ?? '';

  // (Ejemplo simplificado; en producción: consultar BD + password_verify)
  if ($user === 'admin' && $pass === '1234') {
    session_regenerate_id(true);
    $_SESSION['user_id'] = 1;
    $_SESSION['usuario'] = $user;
    $_SESSION['rol']     = 'admin';
    echo "Login OK ✅";
  } else {
    echo "Credenciales inválidas ❌";
  }
}
?>

Tabla comparativa: $_SESSION vs $_COOKIE

Aspecto $_SESSION $_COOKIE
Ubicación de datos Servidor Navegador del usuario
Transmisión No viajan los datos en cada request Se envían en cada request al servidor
Seguridad Más seguro por defecto (no expone datos) Requiere cuidado; visible y manipulable en cliente
Uso típico Login, carrito, estado por usuario Preferencias, recordar idioma/tema

Atajos útiles

Volver

Superglobal $_FILES[...]

$_FILES es una superglobal que contiene la información de los archivos subidos mediante un formulario con method="post" y enctype="multipart/form-data". Cada input de tipo file genera una entrada en $_FILES.

¿Qué contiene $_FILES?

Para un input <input type="file" name="foto">, se obtiene:

ÍndiceDescripciónEjemplo
$_FILES['foto']['name']Nombre original del archivoavatar.png
$_FILES['foto']['type']Tipo MIME (según el navegador)image/png
$_FILES['foto']['size']Tamaño en bytes34567
$_FILES['foto']['tmp_name']Ruta temporal en el servidor/tmp/php7aBcDe
$_FILES['foto']['error']Código de error0 (éxito)

Formulario de ejemplo (POST + multipart)

<form action="subir.php" method="post" enctype="multipart/form-data">
  <label>Seleccioná una imagen:</label>
  <input type="file" name="foto" accept="image/*">
  <button type="submit">Subir</button>
</form>

PHP básico para recibir el archivo

<?php
// subir.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  if (isset($_FILES['foto']) && $_FILES['foto']['error'] === UPLOAD_ERR_OK) {
    $tmp  = $_FILES['foto']['tmp_name'];
    $name = basename($_FILES['foto']['name']); // OJO: sanitizar
    $dest = __DIR__ . '/uploads/' . $name;

    // Crear carpeta si no existe
    if (!is_dir(__DIR__ . '/uploads')) {
      mkdir(__DIR__ . '/uploads', 0775, true);
    }

    if (move_uploaded_file($tmp, $dest)) {
      echo "✅ Archivo subido a: " . $dest;
    } else {
      echo "❌ No se pudo mover el archivo.";
    }
  } else {
    echo "❌ Error en la subida: " . ($_FILES['foto']['error'] ?? 'sin archivo');
  }
}
?>

Validaciones recomendadas

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  $maxBytes = 2 * 1024 * 1024; // 2 MB
  $permitidos = ['image/jpeg','image/png','image/gif'];

  if (!isset($_FILES['foto']) || $_FILES['foto']['error'] !== UPLOAD_ERR_OK) {
    die("Error en la carga.");
  }

  // Tamaño
  if ($_FILES['foto']['size'] > $maxBytes) {
    die("Archivo demasiado grande (máx 2MB).");
  }

  // Tipo MIME (verificación doble: MIME + extensión)
  $finfo = new finfo(FILEINFO_MIME_TYPE);
  $mime = $finfo->file($_FILES['foto']['tmp_name']);
  if (!in_array($mime, $permitidos, true)) {
    die("Tipo no permitido.");
  }

  // Nombre seguro (evitar rutas y caracteres raros)
  $ext = pathinfo($_FILES['foto']['name'], PATHINFO_EXTENSION);
  $nombreSeguro = bin2hex(random_bytes(8)) . '.' . strtolower($ext);

  $dest = __DIR__ . '/uploads/' . $nombreSeguro;
  if (!is_dir(__DIR__ . '/uploads')) mkdir(__DIR__ . '/uploads', 0775, true);

  if (move_uploaded_file($_FILES['foto']['tmp_name'], $dest)) {
    echo "Subido como: " . htmlspecialchars($nombreSeguro);
  } else {
    echo "No se pudo guardar el archivo.";
  }
}
?>

Códigos de error comunes en $_FILES['campo']['error']

ConstanteValorSignificado
UPLOAD_ERR_OK0Éxito
UPLOAD_ERR_INI_SIZE1Excede upload_max_filesize de php.ini
UPLOAD_ERR_FORM_SIZE2Excede MAX_FILE_SIZE del formulario
UPLOAD_ERR_PARTIAL3Archivo subido parcialmente
UPLOAD_ERR_NO_FILE4No se subió archivo
UPLOAD_ERR_NO_TMP_DIR6Falta carpeta temporal
UPLOAD_ERR_CANT_WRITE7Error al escribir en disco
UPLOAD_ERR_EXTENSION8Extensión de PHP detuvo la subida

Ajustes del servidor (php.ini) a considerar

Buenas prácticas

Volver

Superglobal $_SERVER[...]

$_SERVER es un array asociativo que contiene información sobre la petición HTTP, el servidor y el entorno de ejecución. Incluye datos como el método de la request, la URL, cabeceras, IP del cliente, nombre del host, ruta del script, etc.

Importante: algunos índices pueden variar según el servidor (Apache, Nginx, CGI, FPM) o proxies/reverse proxies. No asumas que todos existen siempre; comprobá con isset().

Índices comunes de $_SERVER

ÍndiceDescripciónEjemplo
$_SERVER['REQUEST_METHOD'] Método HTTP utilizado GET / POST
$_SERVER['REQUEST_URI'] Ruta solicitada (con query string) /productos/listar?page=2
$_SERVER['QUERY_STRING'] Cadena de consulta (parte después de ?) page=2&orden=asc
$_SERVER['HTTP_HOST'] Host enviado por el cliente example.com
$_SERVER['HTTP_USER_AGENT'] User-Agent del navegador/cliente Mozilla/5.0 ...
$_SERVER['HTTPS'] Presente si la conexión es HTTPS (depende del servidor) on / 1
$_SERVER['REMOTE_ADDR'] IP del cliente (ojo con proxies) 203.0.113.25
$_SERVER['SERVER_NAME'] Nombre del servidor example.com
$_SERVER['SERVER_ADDR'] IP del servidor 192.0.2.10
$_SERVER['SERVER_PROTOCOL'] Protocolo HTTP/1.1, HTTP/2
$_SERVER['SCRIPT_NAME'] Ruta del script ejecutado /public/index.php
$_SERVER['DOCUMENT_ROOT'] Raíz del documento del servidor /var/www/html

Detectar método, URL y protocolo

<?php
$metodo   = $_SERVER['REQUEST_METHOD'] ?? '';
$uri      = $_SERVER['REQUEST_URI']    ?? '';
$protocolo= $_SERVER['SERVER_PROTOCOL'] ?? '';
echo "Método: $metodo\nURI: $uri\nProtocolo: $protocolo";
?>

¿La conexión es HTTPS?

<?php
$esHttps = false;

if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') {
  $esHttps = true;
}
// Detrás de proxy/reverse proxy:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
  $esHttps = true;
}

echo $esHttps ? "Conexión segura (HTTPS)" : "Conexión no segura (HTTP)";
?>

Obtener IP del cliente (considerando proxies)

<?php
function ipCliente(): string {
  $cabeceras = [
    'HTTP_CLIENT_IP',
    'HTTP_X_FORWARDED_FOR',
    'HTTP_X_FORWARDED',
    'HTTP_X_CLUSTER_CLIENT_IP',
    'HTTP_FORWARDED_FOR',
    'HTTP_FORWARDED',
    'REMOTE_ADDR'
  ];
  foreach ($cabeceras as $h) {
    if (!empty($_SERVER[$h])) {
      // X-Forwarded-For puede traer una lista de IPs
      $ips = explode(',', $_SERVER[$h]);
      foreach ($ips as $ip) {
        $ip = trim($ip);
        if (filter_var($ip, FILTER_VALIDATE_IP)) {
          return $ip;
        }
      }
    }
  }
  return 'desconocida';
}

echo "IP cliente: " . ipCliente();
?>

Leer cabeceras HTTP

<?php
// Si está disponible:
if (function_exists('getallheaders')) {
  $headers = getallheaders();
  foreach ($headers as $k => $v) {
    echo $k . ': ' . $v . "\n";
  }
} else {
  // Alternativa: recorrer $_SERVER con prefijo HTTP_
  foreach ($_SERVER as $k => $v) {
    if (strpos($k, 'HTTP_') === 0) {
      echo $k . ': ' . $v . "\n";
    }
  }
}
?>

Construir la URL completa actual

<?php
$esHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') 
           || (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https');
$scheme = $esHttps ? 'https' : 'http';
$host   = $_SERVER['HTTP_HOST']       ?? 'localhost';
$uri    = $_SERVER['REQUEST_URI']     ?? '/';

$urlActual = $scheme . '://' . $host . $uri;
echo $urlActual;
?>

Ruta del script y document root

<?php
$script = $_SERVER['SCRIPT_NAME']   ?? '';
$root   = $_SERVER['DOCUMENT_ROOT'] ?? '';
echo "SCRIPT_NAME: $script\nDOCUMENT_ROOT: $root";
?>

Buenas prácticas

Volver

Superglobal $_ENV[...]

La superglobal $_ENV contiene variables de entorno disponibles para el script PHP. Estas variables suelen provenir del sistema operativo, de la configuración de php.ini o de archivos de configuración externos (por ejemplo, un .env en frameworks modernos).

Tip: Aunque podés usar $_ENV directamente, en muchos servidores las variables de entorno también están disponibles mediante getenv().

Ejemplo de lectura de $_ENV

<?php
// Acceder a una variable de entorno
echo $_ENV['PATH'];

// O usando getenv()
echo getenv('PATH');
?>

Definir variables de entorno

Ejemplo práctico

<?php
// Archivo de configuración
$_ENV['DB_HOST'] = "localhost";
$_ENV['DB_USER'] = "root";
$_ENV['DB_PASS'] = "secreto";

// Uso en conexión
$host = $_ENV['DB_HOST'];
$user = $_ENV['DB_USER'];
$pass = $_ENV['DB_PASS'];

echo "Conectando a la BD en $host con usuario $user";
?>

Ventajas de usar $_ENV

Comparación con otras superglobales

SuperglobalFuenteUso común
$_ENV Variables de entorno del sistema/servidor Configurar BD, API keys, rutas
$_SERVER Info del servidor y de la petición Método HTTP, cabeceras, ruta del script
$_COOKIE Datos almacenados en el navegador Preferencias, recordar usuario
$_SESSION Datos guardados en el servidor por usuario Login, carrito de compras
Volver

Superglobal $GLOBALS[...]

La superglobal $GLOBALS es un array asociativo que contiene todas las variables definidas en el ámbito global del script PHP. Permite acceder a variables globales desde funciones o métodos sin necesidad de usar la palabra clave global.

Tip: Usá $GLOBALS con cuidado. Si bien puede ser útil para debugging o casos puntuales, abusar de variables globales dificulta el mantenimiento del código.

Ejemplo básico

<?php
$numero = 42;

function mostrarNumero() {
  echo $GLOBALS['numero']; // Accede a $numero desde dentro de la función
}

mostrarNumero(); // 42
?>

Comparación con usar global

<?php
$mensaje = "Hola mundo";

// Usando global
function ejemplo1() {
  global $mensaje;
  echo $mensaje;
}

// Usando $GLOBALS
function ejemplo2() {
  echo $GLOBALS['mensaje'];
}

ejemplo1(); // Hola mundo
ejemplo2(); // Hola mundo
?>

Uso típico

Ejemplo de depuración con $GLOBALS

<?php
$usuario = "Pablo";
$rol     = "admin";

var_dump($GLOBALS);
/*
array( ... ) {
  ["usuario"] => string(5) "Pablo"
  ["rol"] => string(5) "admin"
  ["GLOBALS"] => &array(...) // referencia a sí mismo
}
*/
?>

Tabla resumen

CaracterísticaDescripción
Tipo Array asociativo
Clave Nombre de la variable global (ej: "usuario")
Valor Contenido de la variable global
Alcance Disponible en cualquier parte del script
VOLVER