Escopo de variáveis
Esta aula aborda o escopo de variáveis em PHP, diferenciando entre escopo local e global, explicando as palavras-chave global e static, apresentando as superglobais e fornecendo boas práticas para evitar efeitos colaterais.
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ãoPara 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; // PedroOutra 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(); // 3Variá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 POSTSuperglobais 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
- PHP: Escopo de variáveis - Manual
- PHP: Superglobals - Manual
- PHP: filter_input - Manual
- PHP: htmlspecialchars - Manual
- PHP: Variáveis variáveis - Manual
Exercícios
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); // 8Escreva 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(); // 2Explique por que a variável
$GLOBALSé considerada uma superglobal e dê um exemplo de uso dentro de uma função sem usarglobal.✓ 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(); // AnaQual 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: 2Crie um script que use
$_SERVERpara 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();