Escopo e variáveis super poderosas
Variáveis globais são aquelas definidas na raiz do script, fora de qualquer outro escopo, e que não existem dentro de uma função ou método, da mesma forma que variáveis criadas em um desses escopos deixarão de existir fora dele.
As variáveis superglobais, entretanto, podem ser acessadas em qualquer escopo, e são elas $GLOBALS, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV, $_REQUEST e $_SESSION. Acontece que não é possível definir uma outra variável como superglobal (ao menos não sem o uso da Runkit), e aí a confusão começa.
A partir de um escopo, para declarar que uma variável pertence ao escopo global, utiliza-se a keyword global dentro desse escopo, mesmo que a variável ainda não tenha sido definida, quando nesse caso passará a existir se definida pela função.
<?php
$chamadas = 0;
function carregar(){
global $chamadas, $artista;
$chamadas++;
$artista = “Whitesnake”;
}
carregar();
echo $artista, “ - ”, $chamadas; // Whitesnake - 1
?>
Contudo, são inúmeras as vezes que observei o uso incorreto do global, fora de qualquer escopo, com o objetivo de tornar a variável uma superglobal. Mas na realidade, além de constatar o óbvio declarando que uma variável global pertence ao próprio escopo global, isso simplesmente não funciona e obriga o desenvolvedor a utilizar a keyword global novamente dentro do escopo onde deseja ter o acesso.

O diagrama acima evidencia as superglobais na direita, acessíveis de qualquer lugar, as variáveis ao fundo limitadas aos seus respectivos escopos e, compondo a linha de frente, as variáveis globais, existentes ao longo do script e que podem ser utilizadas em um determinado escopo com o uso da keyword global. Então mesmo que você chame sua variável de Docinho, ela não vai se tornar uma superglobal.
Outra maneira de utilizar variáveis globais é pela superglobal $GLOBALS, uma array associativa com referência às variáveis no escopo global.
É importante observar ainda que, de uma forma geral, variáveis globais são uma causa comum de problemas, já que você não sabe se o valor é realmente o que você espera que seja. Um método simples de evitar isso é passar as variáveis necessárias como parâmetro para a função ou objeto que vai utilizá-las.
Eu só consegui perceber o problema de confiar em variáveis globais com a ajuda da minha mãe. Certa vez ela deixou um pudim delicioso na geladeira, e na manhã seguinte colocou uma travessa de peixe na prateleira de baixo. Pronto, o pudim ficou com gosto de sardinha o resto da semana. E foi assim que eu aprendi que devo separar minhas varáveis em lugares seguros, evitando que fatores externos acabem estragando tudo sem que eu sequer perceba.
E pra ficar claro, o que foi abordado nada tem a ver com o uso da diretiva register_globals que, quando ativada, define o conteúdo de $_ENV, $_GET, $_POST, $_COOKIE e $_SERVER como variáveis globais. Então $_POST['nome'] também passa a existir como $nome, $_GET['pagina'] também como $pagina, e assim por diante. Este terrível fenômeno está desativado por padrão desde a versão 4.2 e será removido por completo no PHP 6.




