Tudo que você precisa saber sobre escopo de variável no PHP
Quando você está começando a trabalhar com funções e objetos em PHP, o escopo de variável pode ser a causa de alguma confusão. Felizmente, as regras para o escopo no PHP são fáceis de compreender (em comparação com outras linguagens).
Neste artigo você aprenderá tudo o que você precisa saber sobre escopo de variável em PHP. Veremos:
- O conceito de escopo de variáveis, o que é e o que significa.
- As diferenças entre escopo local e global.
- Como acessar variáveis globais dentro de uma função.
- Variáveis superglobais do PHP, e como elas funcionam.
- Como usar variáveis estáticas.
Vamos começar!
O que é escopo de variável?
O escopo de variável é o contexto no qual a variável foi criada, e no qual ela pode ser acessada. Essencialmente, o PHP tem dois escopos:
- Global: A variável fica acessível em qualquer parte do script
- Local: A variável é acessível só dentro da função (ou método) que ele foi criado.
O escopo de variáveis – especialmente o escopo local – ajuda a tornar o código mais fácil de gerenciar. Se todas as suas variáveis são globais, elas podem ser lidas e alteradas em qualquer lugar do seu código. Isso pode causar um grande caos no seu script, com muitas partes tentando acessar e trabalhar com a mesma variável. Ao restringir uma variável ao escopo local, você limita a quantidade de código que pode acessar essa variável, tornando o código mais robusto, mais modular e mais fácil de depurar.
Aqui temos um exemplo de uma variável local e uma global:
<?php
$globalName = "Zoe";
function Hello() {
$localName = "Harry";
echo "Olá, $localName!<br>";
}
Hello();
echo "O valor da $globalName é: '$globalName'<br>";
echo "O valor da $localName é: '$localName'<br>";
?>
Este script irá gerar o resultado:
Neste script, criamos duas variáveis:
- $globalName: é uma variável global, uma vez que não foi criada dentro de nenhuma função.
- $localName: é uma variável local, ela foi criada e usada dentro da função Hello().
Depois de criar a variável global e a função, o script chama o método Hello(), que exibe “Olá, Harry!”. O script tenta exibir os valores das variáveis usando echo. Veja o que acontece:
- Como $globalName foi criada fora da função, ela é acessível em qualquer parte do código, assim o seu valor “Zoe”, é mostrado.
- Já $localName, por outro lado, só é acessível de dentro da função Hello(). Desta forma o echo, que está fora da função não terá acesso a esta variável local. Em vez disso, o PHP gera um erro, depois exibe o echo.
Acessando variáveis globais dentro das funções
Como mencionei acima, você pode ler e alterar o valor de uma variável global em qualquer lugar em seuscript.
Para acessar uma variável global fora de uma função, basta escrever o nome da variável. Para acessar uma variável global dentro de uma função, no entanto, primeiro você precisa declarar a variável como global dentro da função usando a palavra-chave global:
function myFunction() {
global $globalName;
//Acesso a variável $globalName
}
Se você não fizer isto, o PHP assume que você está tentando criar ou usar uma variável local.
Aqui está um exemplo de script com uma função que acessa uma variável global:
<?php
$globalName = "Zoe";
function Hello() {
$localName = "Harry";
echo "Olá, $localName!<br>";
global $globalName;
echo "Olá, $globalName!<br>";
}
Hello();
?>
O resultado será:
A função Hello() usa a palavra-chave global para declarar a variável $globalName como global. Assim ela pode acessar a variável e exibir o seu conteúdo (“Zoe”).
Explicando SuperGlobais
O PHP fornece um conjunto especial de arrays globais contendo várias informações úteis. Esses arrays são conhecidos como superglobais, porque eles são acessíveis em qualquer lugar no seu código – inclusive dentro de funções – e você nem precisa declará-los como global usando a palavra-chave global.
Arqui está a lista completa de superglobais disponíveis no PHP, a partir da versão 5.3:
- $GLOBALS: Contém uma lista de todas as variáveis globais disponíveis no script
- $_GET: Contém uma lista de todos os campos do formulário enviado pelo navegador usando o pedido GET.
- $_POST: Contém uma lista de todos os campos do formulário enviado pelo navegador usando o pedido POST.
- $_COOKIE: Contém uma lista de todos os cookies enviados pelo navegador.
- $_REQUEST: Contém todas as chaves e valores das variáveis $_GET, $_GET e $_COOKIEcombinados.
- $_FILES: Contém uma lista dos arquivos enviados pelo navegador.
- $_SESSION: Permite armazenar e recuperar variáveis na sessão atual do navegador.
- $_SERVER: Contém informações do servidor, como nome do arquivo em execução, bem como o endereço IP do navegador.
- $_ENV: Contém uma lista de variáveis de ambiente passadas pelo navegador. Podem ser variáveis fornecidas pelo Shell, assim como as variáveis CGI.
Por exemplo, podemos usar a superglobal $_GET, para recuperar um valor incluído na query string da URL, e mostrar o valor na página:
<?php
$seuNome = $_GET['seuNome'];
echo "Ola, $seuNome!";
?>
Para executa-lo, coloque no fim da URL ?seuNome=”seu nome”, por exemplo:www.seusite.com/script.php?seuNome=Felipe, o resultado será o seguinte:
Atenção: Em uma aplicação do mundo real, você nunca deve enviar as informações do usuário diretamente pelo navegador, como no exemplo acima. Isto é um risco de segurança.
A superglobal é útil porque permite que você acesse as variáveis globais dentro de funções sem precisar usar a palavra-chave global. Por exemplo:
<?php
$globalName = "Zoe";
function Hello() {
global $globalName;
echo "Olá, " . $GLOBALS['globalName']. "!<br>";
}
Hello();//Resultado Olá, Zoe!
?>
Variáveis estáticas:
Quando você cria uma variável local dentro de uma função, essa variável só existe enquanto a função está sendo executada. Quando a função acaba, a variável local desaparece. Quando a função é chamada novamente, uma nova variável local é criada.
Isto garante que as suas funções são autossuficientes, e que elas funcionam na mesma maneira toda vez que forem chamadas.
No entanto, existem situações onde é útil criar uma variável local que mantém o mesmo valor entre cada chamada da função. É exatamente assim que funcionam as variáveis estáticas.
Para criar uma variável estática, você deve escrever a palavra-chave static antes do nome da variável e atribuir um valor inicial para a variável. Por exemplo:
function minhaFuncao() {
static $variavel = 0;
}
Vejamos uma situação onde as variáveis estáticas são úteis. Digamos que você tenha criado uma função que cria widgets, e retorna o número de widgets criado até então. Você pode tentar fazer isto com variável local:
<?php
function createWidget() {
$numWidgets = 0;
return ++$numWidgets;
}
echo "Criando alguns widgets...<br>";
echo createWidget() . " criado até agora.<br>";
echo createWidget() . " criado até agora.<br>";
echo createWidget() . " criado até agora.<br>";
?>
No entanto, toda vez que a função é chamada, a variável $numWidgets é criada, então ela não produz o resultado desejado:
Se criarmos a variável estática, podemos obter o valor da outra chamada da função, preservando o seu valor:
<?php
function createWidget() {
static $numWidgets = 0;
return ++$numWidgets;
}
echo "Criando alguns widgets...<br>";
echo createWidget() . " criado até agora.<br>";
echo createWidget() . " criado até agora.<br>";
echo createWidget() . " criado até agora.<br>";
?>
O resultado será:
Obs: As variáveis estáticas só mantêm seus valores entre as chamas da função, enquanto o script estiver em execução. Quando acabar a execução do script, as variáveis estáticas são destruídas, bem como as variáveis locais e globais.