Escopo de variáveis
Esta aula aborda o escopo de variáveis em PHP, explicando as diferenças entre variáveis locais e globais, o uso das palavras-chave global e static, uma visão geral das superglobais e boas práticas para gerenciar o escopo. O conteúdo inclui exemplos práticos e exercícios para fixação.
Em PHP, o escopo de uma variável define a região do código onde ela pode ser acessada. Compreender o escopo é fundamental para evitar efeitos colaterais indesejados e escrever código mais seguro e previsível. Nesta aula, vamos explorar os conceitos de variáveis locais e globais, as palavras-chave global e static, as superglobais do PHP e as melhores práticas relacionadas.
O PHP possui regras de escopo simples: variáveis definidas dentro de uma função são locais à função; variáveis definidas fora de qualquer função são globais. No entanto, há mecanismos para acessar variáveis globais dentro de funções e para manter valores entre chamadas de função.
Local vs global
Uma variável declarada dentro de uma função é local a essa função: ela não pode ser acessada fora dela. Já uma variável declarada fora de qualquer função é global e pode ser acessada em qualquer parte do script, exceto dentro de funções, a menos que seja explicitamente importada.
Exemplo:
<?php
$global = "Fora da função";
function teste() {
$local = "Dentro da função";
echo $local; // funciona
echo $global; // gera um aviso: variável indefinida
}
teste();
echo $local; // gera um aviso
echo $global; // funciona
?>No exemplo acima, $global não é acessível dentro de teste() a menos que seja declarada como global. Da mesma forma, $local não existe fora da função.
global e static
A palavra-chave global permite acessar uma variável global dentro de uma função. Ela faz referência à variável global, não criando uma cópia local.
<?php
$contador = 0;
function incrementar() {
global $contador;
$contador++;
}
incrementar();
echo $contador; // 1
?>A palavra-chave static é usada dentro de funções para manter o valor de uma variável entre chamadas, sem perder seu escopo local. A variável estática é inicializada apenas na primeira chamada da função e preserva seu valor nas chamadas subsequentes.
<?php
function contador() {
static $num = 0;
$num++;
return $num;
}
echo contador(); // 1
echo contador(); // 2
echo contador(); // 3
?>Variáveis estáticas são úteis para armazenar estado dentro de funções sem usar variáveis globais.
Superglobais (visão geral)
O PHP possui variáveis pré-definidas chamadas superglobais, que estão disponíveis em todos os escopos sem necessidade de declarar global. As principais são:
$_GET– parâmetros da URL (método GET)$_POST– dados enviados via formulário (método POST)$_REQUEST– combinação de GET, POST e COOKIE$_SESSION– variáveis de sessão$_COOKIE– cookies HTTP$_SERVER– informações do servidor e ambiente$_FILES– arquivos enviados via upload$_ENV– variáveis de ambiente$GLOBALS– referência a todas as variáveis globais
Exemplo de uso de $GLOBALS:
<?php
$x = 10;
function teste() {
echo $GLOBALS['x']; // 10
}
?>Superglobais são arrays associativos e devem ser usadas com cuidado para evitar vulnerabilidades de segurança (como injeção de dados não confiáveis).
Boas práticas
Evite o uso excessivo de variáveis globais, pois elas tornam o código mais difícil de entender e testar. Prefira passar valores como parâmetros de função ou usar injeção de dependência.
Use variáveis estáticas com moderação, apenas quando fizer sentido manter estado interno. Prefira objetos ou closures quando precisar de mais complexidade.
Sempre valide e sanitize dados vindos de superglobais ($_GET, $_POST, etc.) antes de usá-los, para prevenir ataques como XSS e SQL injection.
Mantenha as funções curtas e com responsabilidade única; isso naturalmente reduz a necessidade de variáveis globais.
Considere usar namespaces e classes para organizar o código e evitar conflitos de nomes.
Referências
- PHP Manual: Escopo de variáveis
- PHP Manual: Superglobals
- PHP Manual: Variáveis variáveis
- PHP Manual: isset
- PHP Manual: Garbage Collection
- W3Schools: PHP Superglobals
Exercícios
Crie uma função que use uma variável global para contar quantas vezes foi chamada. Implemente usando a palavra-chave
global.✓ Resposta:<?php $contador = 0; function chamada() { global $contador; $contador++; } chamada(); chamada(); echo $contador; // 2 ?>Escreva uma função que retorne um número incrementado a cada chamada, usando uma variável estática.
✓ Resposta:<?php function incremento() { static $num = 0; $num++; return $num; } echo incremento(); // 1 echo incremento(); // 2 echo incremento(); // 3 ?>Explique a diferença entre variáveis locais e globais. Dê um exemplo de cada.
✓ Resposta:Variáveis locais são declaradas dentro de funções e só podem ser acessadas ali. Variáveis globais são declaradas fora de funções e podem ser acessadas em qualquer lugar, exceto dentro de funções sem a palavra-chave
global. Exemplo:<?php $global = "global"; function exemplo() { $local = "local"; echo $local; // funciona // echo $global; // não funciona sem global } exemplo(); echo $global; // funciona // echo $local; // não funciona ?>Liste três superglobais do PHP e dê um exemplo de uso para cada uma.
✓ Resposta:$_GET: acessar parâmetros da URL, ex:$_GET['id']$_POST: acessar dados de formulário, ex:$_POST['nome']$_SERVER: obter informações do servidor, ex:$_SERVER['REMOTE_ADDR']
Crie um script que use
$GLOBALSpara modificar uma variável global dentro de uma função.✓ Resposta:<?php $valor = 100; function dobrar() { $GLOBALS['valor'] *= 2; } dobrar(); echo $valor; // 200 ?>