W3docs

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:

SuperglobalContieneUso típico
$_GETParámetros de cadena de consulta (?key=value)Búsqueda, paginación, filtros
$_POSTCampos de formulario enviados en el cuerpo de la solicitudInicio de sesión, registro, entrada de datos
$_REQUESTCombinación de $_GET, $_POST y $_COOKIEConveniencia (usar con precaución)
$_FILESArchivos subidos mediante un formulario multipartSubida de archivos e imágenes
$_COOKIECookies enviadas por el navegador"Recuérdame", preferencias
$_SESSIONDatos por usuario almacenados en el servidorEstado de sesión, carritos de compra
$_SERVERInformación del servidor y la solicitud (cabeceras, rutas)Enrutamiento, detección del método HTTP
$_ENVVariables de entornoConfiguración, secretos, claves API
$GLOBALSTodas las variables en el ámbito globalAcceder 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, $_COOKIE y $_FILES proviene 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 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.

Práctica

Práctica
¿Cuáles son los diferentes tipos de superglobales en PHP?
¿Cuáles son los diferentes tipos de superglobales en PHP?
Was this page helpful?