W3docs

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:

SuperglobalContémUso típico
$_GETParâmetros da query string (?key=value)Pesquisa, paginação, filtros
$_POSTCampos de formulário enviados no corpo da requisiçãoLogin, cadastro, entrada de dados
$_REQUESTMesclagem de $_GET, $_POST e $_COOKIEConveniência (use com cuidado)
$_FILESArquivos enviados via formulário multipartUploads de arquivo/imagem
$_COOKIECookies enviados pelo navegador"Lembrar de mim", preferências
$_SESSIONDados por usuário armazenados no servidorEstado de login, carrinhos de compras
$_SERVERInformações do servidor e da requisição (cabeçalhos, caminhos)Roteamento, detecção do método HTTP
$_ENVVariáveis de ambienteConfiguração, segredos, chaves de API
$GLOBALSTodas as variáveis no escopo globalAcessar 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, $_COOKIE e $_FILES vem 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 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.

Prática

Prática
Quais são os diferentes tipos de Superglobais em PHP?
Quais são os diferentes tipos de Superglobais em PHP?
Was this page helpful?