Superglobales de PHP
Las superglobales de PHP son variables integradas disponibles en todos los ámbitos. Aprende para qué sirve cada una y cómo usarlas de forma segura.
Superglobales de PHP
Las superglobales son variables integradas de PHP que están siempre disponibles, en cualquier ámbito, sin ninguna declaración. A diferencia de las variables ordinarias, no es necesario escribir global $var; para usarlas dentro de una función: son visibles en todas partes de forma automática. Son el puente entre el mundo exterior (el navegador, el servidor web, el sistema operativo) y tu script PHP: los datos de formularios entrantes, las cookies, el estado de sesión y los metadatos de la solicitud llegan todos a través de superglobales.
Este capítulo cubre qué contiene cada superglobal, cuándo usarla y los problemas de seguridad que suelen tropezar a los principiantes.
¿Qué son las superglobales de PHP?
Una superglobal es un array asociativo predefinido que PHP rellena por ti antes de que se ejecute tu script. Hay nueve superglobales:
| Superglobal | Contiene | Uso típico |
|---|---|---|
$_GET | Parámetros de cadena de consulta (?key=value) | Búsqueda, paginación, filtros |
$_POST | Campos de formulario enviados en el cuerpo de la solicitud | Inicio de sesión, registro, entrada de datos |
$_REQUEST | Combinación de $_GET, $_POST y $_COOKIE | Conveniencia (usar con precaución) |
$_FILES | Archivos subidos mediante un formulario multipart | Subida de archivos e imágenes |
$_COOKIE | Cookies enviadas por el navegador | "Recuérdame", preferencias |
$_SESSION | Datos por usuario almacenados en el servidor | Estado de sesión, carritos de compra |
$_SERVER | Información del servidor y la solicitud (cabeceras, rutas) | Enrutamiento, detección del método HTTP |
$_ENV | Variables de entorno | Configuración, secretos, claves API |
$GLOBALS | Todas las variables en el ámbito global | Acceder a variables globales desde dentro de una función |
Como son arrays, lees un valor por clave — por ejemplo $_GET['name'] — y puedes inspeccionar el array completo con print_r() o var_dump() durante la depuración.
La seguridad primero. Todo lo que hay en
$_GET,$_POST,$_REQUEST,$_COOKIEy$_FILESproviene del usuario y debe tratarse como no confiable. Siempre verifica que exista una clave, luego valídala y escápala antes de usarla. Omitir esto abre la puerta a XSS, inyección SQL y lógica rota.
$_GET
$_GET recopila parámetros de la cadena de consulta de la URL. Para la URL example.com/?name=John&page=2, PHP rellena $_GET así:
// URL: example.com/?name=John&page=2
$_GET = ['name' => 'John', 'page' => '2'];
$name = $_GET['name'] ?? 'guest'; // 'John'
$page = (int) ($_GET['page'] ?? 1); // 2
echo "Hello, $name — viewing page $page";Usa $_GET para datos que sea seguro exponer en la URL y que se puedan guardar como marcador o compartir: términos de búsqueda, números de página, orden de clasificación. Observa el operador ?? (fusión de null) — proporciona un valor alternativo para que las claves faltantes no generen una advertencia de "clave de array no definida". Nunca pongas contraseñas ni datos sensibles en $_GET, porque la URL se registra, se almacena en caché y es visible en la barra de direcciones.
$_POST
$_POST recopila datos enviados en el cuerpo de la solicitud HTTP, típicamente desde un formulario con method="post". Los valores no se muestran en la URL, lo que hace que $_POST sea la opción correcta para formularios de inicio de sesión y cualquier acción que modifique datos.
// <form method="post"><input name="email"> ... </form>
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Stored: $email";
} else {
echo "Please enter a valid email address.";
}
}Tanto $_GET como $_POST son fundamentales para trabajar con formularios — consulta PHP Form Handling y PHP Form Validation para obtener ejemplos completos y validados.
$_REQUEST
$_REQUEST es un array de conveniencia que combina $_GET, $_POST y $_COOKIE. Permite leer un valor independientemente de cómo fue enviado:
$id = $_REQUEST['id'] ?? null;Úsalo con moderación. Como el orden en que las tres fuentes se sobrescriben entre sí está controlado por la configuración request_order en php.ini, una cookie podría anular silenciosamente un campo POST. Para un código predecible y seguro, prefiere la superglobal específica ($_GET o $_POST) que realmente esperas.
$_FILES
$_FILES contiene metadatos sobre los archivos subidos a través de un formulario que usa enctype="multipart/form-data". Para un campo llamado avatar, obtienes un array con el nombre original, el tipo MIME, la ruta temporal, el código de error y el tamaño:
// <form method="post" enctype="multipart/form-data">
// <input type="file" name="avatar">
// </form>
if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
$tmp = $_FILES['avatar']['tmp_name'];
$name = basename($_FILES['avatar']['name']);
move_uploaded_file($tmp, __DIR__ . "/uploads/$name");
echo "Uploaded $name";
}Siempre comprueba la clave error y valida el tipo y tamaño del archivo antes de llamar a move_uploaded_file() — nunca confíes en el name o type proporcionado por el cliente.
$_COOKIE
$_COOKIE contiene las cookies que el navegador envió con la solicitud. Una cookie es un pequeño fragmento de datos almacenado en el navegador y devuelto en cada solicitud posterior, útil para recordar preferencias o un token de "mantener sesión iniciada".
// Cookies are set with setcookie(), then read on the NEXT request:
setcookie('theme', 'dark', time() + 86400); // expires in 1 day
$theme = $_COOKIE['theme'] ?? 'light';
echo "Current theme: $theme";Una cookie que estableces con setcookie() no está disponible en $_COOKIE hasta la siguiente solicitud, porque primero viaja al navegador y regresa después. Para el ciclo de vida completo, consulta PHP Cookies.
$_SESSION
$_SESSION almacena datos por usuario en el servidor, identificados por un ID de sesión que viaja en una cookie. Como los datos residen en el servidor, es más seguro que una cookie para estados sensibles como "¿está este usuario conectado?".
Debes llamar a session_start() antes de leer o escribir en $_SESSION:
session_start();
$_SESSION['user_id'] = 42; // write
$id = $_SESSION['user_id'] ?? 0; // read on any page
echo "Logged-in user: $id";Consulta PHP Sessions para ver un ejemplo de inicio de sesión completo y detalles sobre la vida útil de la sesión.
$_SERVER
$_SERVER es rellenado por el servidor web con información sobre la solicitud y el entorno. Claves comunes:
$method = $_SERVER['REQUEST_METHOD']; // 'GET' or 'POST'
$host = $_SERVER['HTTP_HOST']; // 'www.example.com'
$uri = $_SERVER['REQUEST_URI']; // '/products?id=5'
$ip = $_SERVER['REMOTE_ADDR']; // visitor's IP address
if ($method === 'POST') {
echo "Handling a form submission from $ip";
}$_SERVER['REQUEST_METHOD'] es la forma estándar de saber si una página se cargó normalmente (GET) o si se envió un formulario (POST).
$_ENV y $GLOBALS
$_ENV expone las variables de entorno del sistema operativo, que es donde las aplicaciones modernas guardan la configuración y los secretos para mantenerlos fuera del código fuente:
$dbHost = $_ENV['DB_HOST'] ?? 'localhost';
$apiKey = getenv('API_KEY'); // getenv() also reads the environment$GLOBALS es un array de todas las variables definidas en el ámbito global. Permite que una función acceda a una variable global sin la palabra clave global:
$counter = 10;
function increment() {
$GLOBALS['counter']++; // modifies the global $counter
}
increment();
echo $counter; // 11$GLOBALS rara vez es la herramienta adecuada — pasar datos como argumentos de función es más limpio. Para entender por qué, lee PHP Variable Scope.
Conclusión
Las superglobales de PHP son la forma estándar de leer entradas e información de solicitudes en una aplicación web PHP. Usa $_GET para parámetros de URL, $_POST para envíos de formularios, $_FILES para subidas, $_COOKIE y $_SESSION para el estado por usuario, y $_SERVER/$_ENV para detalles de la solicitud y el entorno. La regla que se aplica a todas ellas: los datos que provienen del navegador no son confiables — valídalos y escápalos siempre. Desde aquí, continúa con PHP Form Validation para ver estas superglobales aplicadas a un formulario real y seguro.