PHP Superglobals
PHP oferece variáveis disponíveis em todos os escopos, chamadas de "superglobais". Saiba o que cada uma contém e como usá-las com segurança.
PHP Superglobals
Superglobais são variáveis PHP integradas que estão sempre disponíveis, em qualquer escopo, sem nenhuma declaração. Ao contrário das variáveis comuns, você não precisa escrever global $var; para usá-las dentro de uma função — elas são visíveis em qualquer lugar automaticamente. Elas funcionam como a ponte entre o mundo externo (o navegador, o servidor web, o sistema operacional) e o seu script PHP: dados de formulários recebidos, cookies, estado de sessão e metadados da requisição chegam todos por meio das superglobais.
Este capítulo aborda o que cada superglobal contém, quando utilizá-la e as armadilhas de segurança que a maioria dos iniciantes encontra.
O que são superglobais PHP?
Uma superglobal é um array associativo predefinido que o PHP preenche antes de executar o seu script. Existem nove superglobais:
| Superglobal | Contém | Uso típico |
|---|---|---|
$_GET | Parâmetros da query string (?key=value) | Pesquisa, paginação, filtros |
$_POST | Campos de formulário enviados no corpo da requisição | Login, cadastro, entrada de dados |
$_REQUEST | Mesclagem de $_GET, $_POST e $_COOKIE | Conveniência (use com cuidado) |
$_FILES | Arquivos enviados via formulário multipart | Uploads de arquivo/imagem |
$_COOKIE | Cookies enviados pelo navegador | "Lembrar de mim", preferências |
$_SESSION | Dados por usuário armazenados no servidor | Estado de login, carrinhos de compras |
$_SERVER | Informações do servidor e da requisição (cabeçalhos, caminhos) | Roteamento, detecção do método HTTP |
$_ENV | Variáveis de ambiente | Configuração, segredos, chaves de API |
$GLOBALS | Todas as variáveis no escopo global | Acessar globais dentro de uma função |
Por serem arrays, você lê um valor pela chave — por exemplo $_GET['name'] — e pode inspecionar o array inteiro com print_r() ou var_dump() durante a depuração.
Segurança em primeiro lugar. Tudo em
$_GET,$_POST,$_REQUEST,$_COOKIEe$_FILESvem do usuário e deve ser tratado como não confiável. Sempre verifique se uma chave existe, depois valide e escape antes de usar. Ignorar isso abre a porta para XSS, injeção de SQL e lógica quebrada.
$_GET
$_GET coleta parâmetros da query string da URL. Para a URL example.com/?name=John&page=2, o PHP popula $_GET assim:
// 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";Use $_GET para dados que é seguro expor na URL e que podem ser salvos nos favoritos ou compartilhados: termos de pesquisa, números de página, ordem de classificação. Note o operador ?? (null coalescing) — ele fornece um valor padrão para que chaves ausentes não gerem um aviso de "chave de array indefinida". Nunca coloque senhas ou dados sensíveis em $_GET, pois a URL é registrada em logs, armazenada em cache e visível na barra de endereços.
$_POST
$_POST coleta dados enviados no corpo da requisição HTTP, geralmente de um formulário com method="post". Os valores não aparecem na URL, o que torna $_POST a escolha certa para formulários de login e qualquer ação que altere dados.
// <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 quanto $_POST são fundamentais para trabalhar com formulários — veja PHP Form Handling e PHP Form Validation para exemplos completos e validados.
$_REQUEST
$_REQUEST é um array de conveniência que mescla $_GET, $_POST e $_COOKIE. Ele permite ler um valor independentemente de como foi enviado:
$id = $_REQUEST['id'] ?? null;Use-o com moderação. Como a ordem em que as três fontes se sobrescrevem é controlada pela configuração request_order no php.ini, um cookie pode silenciosamente substituir um campo POST. Para um código previsível e seguro, prefira a superglobal específica ($_GET ou $_POST) que você realmente espera.
$_FILES
$_FILES contém metadados sobre arquivos enviados por um formulário que usa enctype="multipart/form-data". Para um input chamado avatar, você obtém um array com o nome original, tipo MIME, caminho temporário, código de erro e tamanho:
// <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";
}Sempre verifique a chave error e valide o tipo e o tamanho do arquivo antes de chamar move_uploaded_file() — nunca confie no name ou type fornecidos pelo cliente.
$_COOKIE
$_COOKIE contém os cookies que o navegador enviou com a requisição. Um cookie é um pequeno dado armazenado no navegador e retornado em cada requisição subsequente, útil para lembrar preferências ou um token de "permanecer conectado".
// 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";Um cookie que você define com setcookie() não fica disponível em $_COOKIE até a próxima requisição, pois ele viaja para o navegador primeiro e retorna depois. Para o ciclo de vida completo, veja PHP Cookies.
$_SESSION
$_SESSION armazena dados por usuário no servidor, identificado por um ID de sessão que viaja em um cookie. Como os dados ficam no servidor, é mais seguro do que um cookie para estado sensível, como "este usuário está logado".
Você deve chamar session_start() antes de ler ou escrever em $_SESSION:
session_start();
$_SESSION['user_id'] = 42; // write
$id = $_SESSION['user_id'] ?? 0; // read on any page
echo "Logged-in user: $id";Veja PHP Sessions para um exemplo completo de login e detalhes sobre o tempo de vida da sessão.
$_SERVER
$_SERVER é preenchido pelo servidor web com informações sobre a requisição e o ambiente. Chaves comuns:
$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'] é a forma padrão de verificar se uma página foi carregada normalmente (GET) ou se um formulário foi enviado (POST).
$_ENV e $GLOBALS
$_ENV expõe as variáveis de ambiente do sistema operacional, que é onde aplicações modernas mantêm configurações e segredos para que fiquem fora do código-fonte:
$dbHost = $_ENV['DB_HOST'] ?? 'localhost';
$apiKey = getenv('API_KEY'); // getenv() also reads the environment$GLOBALS é um array de todas as variáveis definidas no escopo global. Ele permite que uma função acesse uma variável global sem a palavra-chave global:
$counter = 10;
function increment() {
$GLOBALS['counter']++; // modifies the global $counter
}
increment();
echo $counter; // 11$GLOBALS raramente é a ferramenta certa — passar dados como argumentos de função é mais limpo. Para entender o porquê, leia PHP Variable Scope.
Conclusão
As superglobais PHP são a forma padrão de ler entradas e informações de requisição em uma aplicação web PHP. Use $_GET para parâmetros de URL, $_POST para envios de formulário, $_FILES para uploads, $_COOKIE e $_SESSION para estado por usuário, e $_SERVER/$_ENV para detalhes da requisição e do ambiente. A regra que se aplica a todas elas: dados que se originam do navegador não são confiáveis — valide e escape-os sempre. A partir daqui, continue com PHP Form Validation para ver essas superglobais aplicadas em um formulário real e seguro.