O escopo de uma variável em PHP determina onde ela pode ser acessada dentro do código. Compreender esse conceito é fundamental para escrever programas previsíveis e evitar bugs causados por modificações acidentais. Nesta aula, exploraremos os diferentes tipos de escopo, como controlá-los e as boas práticas recomendadas.

Em PHP, o escopo é geralmente definido pelo bloco de código onde a variável é declarada. Diferente de algumas linguagens, PHP não tem escopo de bloco (exceto para funções), mas sim escopo de função. Ou seja, variáveis declaradas fora de funções são globais, enquanto dentro de funções são locais, a menos que explicitamente declaradas como globais.

Local vs global

Uma variável declarada dentro de uma função é local àquela função. Isso significa que ela não pode ser acessada fora dela, e variáveis externas não são acessíveis dentro da função sem uma declaração especial. O escopo global é o contexto principal do script, fora de qualquer função.

Exemplo: suponha que você tenha uma variável global $nome e uma função que tenta usá-la. Sem a palavra-chave global, a função criará uma variável local com o mesmo nome, sem afetar a global.

$nome = "João";

function saudacao() {
    $nome = "Maria"; // local
    echo "Olá, $nome";
}

saudacao(); // Olá, Maria
echo $nome; // João

Para acessar a variável global dentro da função, usamos a declaração global $nome;. Isso faz com que a variável referencie a global, permitindo leitura e escrita.

$nome = "João";

function saudacao() {
    global $nome;
    echo "Olá, $nome";
    $nome = "Pedro";
}

saudacao(); // Olá, João
echo $nome; // Pedro

Outra forma é usar o array $GLOBALS, que contém todas as variáveis globais. Exemplo: $GLOBALS['nome'].

global e static

Além de global, PHP oferece a palavra-chave static para variáveis locais que precisam manter seu valor entre chamadas da função. Uma variável estática é inicializada apenas na primeira execução da função e preserva seu valor nas chamadas subsequentes.

function contador() {
    static $cont = 0;
    $cont++;
    echo $cont;
}

contador(); // 1
contador(); // 2
contador(); // 3

Variáveis estáticas são úteis para contadores, caches ou qualquer estado que precise persistir dentro de uma função sem usar variáveis globais. Elas são locais ao escopo da função, mas com tempo de vida igual ao da execução do script.

Já a combinação global static não é permitida. Uma variável não pode ser global e estática ao mesmo tempo, pois são conceitos opostos: global é acessível em todo o script, estática é local à função.

Superglobais (visão geral)

Superglobais são variáveis pré-definidas pelo PHP que estão disponíveis em todos os escopos sem necessidade de declaração global. Elas são arrays associativos que contêm informações do servidor, requisições, sessões, etc. As principais são:

  • $_GET - dados enviados via URL (parâmetros GET)
  • $_POST - dados enviados via corpo da requisição (POST)
  • $_REQUEST - combinação de GET, POST e COOKIE
  • $_SESSION - variáveis de sessão
  • $_COOKIE - cookies HTTP
  • $_SERVER - informações do servidor e da requisição
  • $_FILES - arquivos enviados via upload
  • $_ENV - variáveis de ambiente
  • $GLOBALS - todas as variáveis globais

Exemplo de uso dentro de uma função:

function mostrarMetodo() {
    echo $_SERVER['REQUEST_METHOD'];
}

mostrarMetodo(); // GET ou POST

Superglobais são extremamente úteis para obter dados externos sem se preocupar com escopo. No entanto, devem ser usadas com cuidado para evitar vulnerabilidades (como injeção de dados).

Boas práticas

1. Evite variáveis globais sempre que possível. Prefira passar valores como parâmetros para funções. Isso torna o código mais testável e previsível.
2. Use variáveis estáticas com moderação. Elas podem dificultar a compreensão do fluxo, especialmente em funções recursivas.
3. Nunca confie em dados de superglobais sem sanitização. Use filter_input ou htmlspecialchars para evitar XSS e outras ameaças.
4. Prefira constantes ou classes para valores que precisam ser compartilhados globalmente.
5. Documente o comportamento de variáveis estáticas no código, indicando que elas mantêm estado entre chamadas.

Observações finais: Em PHP moderno, com o uso de frameworks e programação orientada a objetos, o escopo global é raramente necessário. Classes e namespaces oferecem melhor encapsulamento. Entender escopo é essencial para manter a qualidade do código.

Referências

Exercícios

  1. Crie uma função que utilize uma variável global para somar um valor passado como parâmetro. A função deve modificar a variável global e retornar o novo valor.

    ✓ Resposta:
    $total = 0;
    
    function somar($valor) {
        global $total;
        $total += $valor;
        return $total;
    }
    
    echo somar(5); // 5
    echo somar(3); // 8
  2. Escreva uma função que use uma variável estática para contar quantas vezes foi chamada e retorne esse número.

    ✓ Resposta:
    function contarChamadas() {
        static $count = 0;
        $count++;
        return $count;
    }
    
    echo contarChamadas(); // 1
    echo contarChamadas(); // 2
  3. Explique por que a variável $GLOBALS é considerada uma superglobal e dê um exemplo de uso dentro de uma função sem usar global.

    ✓ Resposta:

    $GLOBALS é uma superglobal porque está disponível em todos os escopos sem necessidade de declaração. Exemplo:

    $nome = "Ana";
    
    function exibirNome() {
        echo $GLOBALS['nome'];
    }
    
    exibirNome(); // Ana
  4. Qual a diferença entre uma variável local e uma variável estática dentro de uma função? Ilustre com código.

    ✓ Resposta:

    Variável local é recriada a cada chamada; estática mantém seu valor entre chamadas. Exemplo:

    function teste() {
        $local = 0;
        static $estatica = 0;
        $local++;
        $estatica++;
        echo "Local: $local, Estática: $estatica
    "; } teste(); // Local: 1, Estática: 1 teste(); // Local: 1, Estática: 2
  5. Crie um script que use $_SERVER para exibir o endereço IP do usuário e o método da requisição. Escreva o código dentro de uma função.

    ✓ Resposta:
    function informacoes() {
        echo "IP: " . $_SERVER['REMOTE_ADDR'] . "
    "; echo "Método: " . $_SERVER['REQUEST_METHOD']; } informacoes();