Quase todas as pessoas que já estudaram programação ou trabalham com isso já devem ter ouvido alguma coisa ruim sobre as varáveis globais, que não se deve usar, ou ainda que profissionais não usam variáveis globais.
Para aqueles que não conhecem, variáveis globais são variáveis que ficam no escopo global do programa ou script na qual estão inseridas, podendo ser lidas e manipuladas em qualquer parte do programa e script.
É comum vermos programadores pregando que variáveis globais são más, mas nem sempre estas pessoas sabem o por que. Mas quem inventou esta história afinal? Esta é uma pergunta difícil de responder porque este conceito não é necessariamente novo, temos registros dele que variam desde 1973, quando W.A. Wulf e M.Shaw publicaram o paper Global Variables Considered Harmful, que pode ser traduzido para Variáveis Globais Consideradas Prejudiciais, no paper os autores davam 4 pontos principais pelos quais variáveis globais poderiam ser prejudiciais ao código, sendo elas:
- Efeitos colaterais
- No sentido de que funções que poderiam modificar variáveis globais podem gerar efeitos colaterais e surpresas durante a execução
- Acesso Indiscriminado
- Uma vez que elas eram globais, qualquer procedimento ou rotina poderia ter acesso para fazer o que quisesse com a variável, permitindo assim leitura a dados que não necessariamente deveriam ser públicos, ou escrita por rotinas que não deveriam ter este direito.
- Vulnerabilidade
- O Código fica vulnerável no sentido de que novas declarações dentro de um escopo externo podem mudar o sentido dentro de um escopo interno.
- Sem definições que se sobrepõem
- Onde é difícil controlar o acesso as variáveis.
Analisando mais de perto, vemos que os efeitos descritos podem ser resumidos aos efeitos que se pode ter no sistema, uma variável global pode ser lida e alterada em qualquer parte do programa, pode ser usada em um escopo interno quando nenhuma variável de mesmo nome for declarada internamente e pode causar confusão nos programadores durante a programação, contudo analisando isso podemos ver que todos estes problemas estão ligados a uma coisa: O programador.
Em defesa das variáveis globais, elas tem todo o direito de existir, elas tem uma função e propósito bem definido, e são de longe um erro ou desleixo dos criadores das linguagens de programação.
O poder das variáveis globais está justamente em poder ser acessada de qualquer parte do programa, de poder ser mudada por qualquer parte do programa, eu sei que isto parece uma grande burrada, porque fazendo isso você:
- Torna seus métodos, objetos e funções que utilizam esta variável dependentes do ambiente onde ela exista.
- Dificulta teste e modularidade do programa, impedindo que certas partes possam ser movidas entre um programa e outro (uma vez que elas dependem da variável global para funcionar).
- Dificulta o controle do estado e acesso da variável, uma vez que qualquer coisa no seu código pode muda-la.
Contudo se refletirmos dentro dos problemas que encontramos até agora podemos ver que quase todos eles estão ligados aos seres humanos que programam o sistema, a forma como eles programam que fazem as funções serem dependentes, que impedem os métodos e módulos de funcionarem sem ela e que dificultam a administração.
Profissionais usam variáveis globais!
Isso mesmo, olhando alguns softwares e empresas reconhecidas podemos encontrado uso apoio a variáveis globais, entre eles:
WordPress
WordPress possui 66% do Marketshare entre os CMS e possui uma página em sua documentação dedicada exclusivamente a variáveis globais.
Intel
Em seu artigo Global Variable Reconsidered a Intel volta a analisar o cenário das variáveis globais, mostrando aplicações práticas de uso no mundo real em linguagens como C e C++ (não é só PHP e Javascript que usam globais!).
Navegadores e Javascript
Todo o navegador que possui uma janela e roda javascript possui variáveis globais, na API do DOM podemos listar window, document entre outras.
Variáveis globais são recursos, não defeitos!
Antes de sair por ai usando variáveis globais, lembre-se, elas são um recurso sim, mas elas possuem muitas armadilhas e abrem brecha para muitos defeitos. Você deve pensar muito antes de usar uma variável, e em muitos casos analisar se você precisa mesmo de uma, muitas pessoas já pensaram sobre este assunto, e existem diversas soluções para quando você acredita que só uma variável global pode resolver seu problema, como por exemplo o padrão de design Memento usado para armazenar um determinado estado de objetos e Singleton para casos onde você precisa de uma e apenas uma instância de determinado objeto.