Escopo de Funções em PHP: Passagem por Valor vs. Referência (Guia Definitivo)

Se você já tentou alterar uma variável dentro de uma função em PHP e, ao testar, percebeu que o valor continuou o mesmo de antes, parabéns: você acabou de esbarrar na parede do Escopo de Funções. Neste tutorial avançado, vamos entender como o PHP enxerga as variáveis e dominar de vez as duas formas de enviar dados para uma função: Passagem por Valor e Passagem por Referência.

A Ilusão do Escopo: O que acontece na função, fica na função

Para entender o escopo de uma função, vamos começar com um pequeno experimento prático. Vamos definir o valor de uma variável $a = 1. Em seguida, invocamos uma função chamada dobra(), que recebe essa variável e multiplica seu valor por 2. Por fim, damos um echo para ver o resultado.

Ora, se era 1 e dobramos, o resultado impresso deve ser 2, correto? Teste o script abaixo:

<?php
  $a = 1;      // Definimos a variável no mundo externo
  
  dobra($a);   // Chamamos a função
  
  echo $a;     // Imprimimos o resultado
  
  function dobra($a){
   $a *= 2;    // Multiplicamos por 2 dentro da função
  }
?>

E o resultado na sua tela é.... que rufem os tambores... 🥁 tcharam... 1!

Isso mesmo, continua sendo 1! Mas por que não dobrou? Porque, na verdade, nós não dobramos a variável original. Nós dobramos uma cópia dela. As coisas dentro do escopo de uma função são isoladas do resto do seu código.

Passagem por Valor em PHP (O Padrão)

O comportamento padrão do PHP é a Passagem por Valor. Quando passamos uma variável como argumento para uma função, o PHP tira uma espécie de "xerox" dessa variável.

No exemplo acima, quando passamos $a = 1, a função dobra() criou outra variável na memória, que só existe ali dentro, copiou o valor "1" e trabalhou com essa cópia. Quando a função terminou de rodar, essa cópia foi destruída e a variável original continuou intacta do lado de fora.

💡 Como resolver isso? Para fazer a função devolver o resultado para o mundo externo, precisamos usar o comando return e forçar a nossa variável externa a receber esse novo valor: $a = dobra($a);

Passagem por Referência (O Operador &)

E se nós realmente quisermos passar a variável em si, para que ela seja alterada permanentemente dentro do escopo da função, sem precisar usar o return? Nós usamos a Passagem por Referência.

Para passar uma variável por referência, não passamos o valor dela, passamos o endereço de memória onde ela mora. Para fazer isso no PHP, basta colocar o símbolo E comercial (&) antes do parâmetro na declaração da função, ficando assim: &$a.

Vamos refazer o mesmo código, apenas adicionando o operador de referência:

<?php
  $a = 1;
  
  dobra($a);
  
  echo $a; // Agora o resultado na tela será 2!
  
  // Note o operador & antes da variável
  function dobra(&$a){
   $a *= 2; 
  }
?>

Mágica? Não, arquitetura de memória! Como passamos o endereço exato da variável (a referência), a função não fez uma cópia. Ela foi lá na memória do servidor e alterou a variável original.

Característica Passagem por Valor Passagem por Referência (&)
O que é passado? Uma cópia idêntica do dado. O endereço de memória (a variável real).
Altera a variável original? Não. Sim.
Uso do Return Obrigatório se quiser usar o novo valor fora. Desnecessário para aquela variável específica.

Escopo Isolado: A função é cega para o mundo externo

Para fixar esse conceito de "isolamento" (escopo local), veja este outro exemplo. Nós criamos uma variável chamada $curso e, em seguida, tentamos dar um echo nela de dentro de uma função vazia:

<?php
  $curso = "PHP Progressivo";
   
  function exibe(){
   echo $curso; // O PHP vai gerar um aviso (Notice) de variável indefinida!
  }
  
  exibe();
?>

Note o que aconteceu na tela: absolutamente nada (ou um erro de Notice, dependendo da configuração do seu servidor).

Isso prova que a função é um mundo à parte. Se a variável $curso não foi passada para ela através dos parênteses (parâmetros), a função simplesmente não sabe que ela existe. Ela nunca viu, nem ouviu falar. Uma função no PHP só tem acesso àquilo que você entrega explicitamente na mão dela.

Pare de caçar bugs de escopo no StackOverflow!

A lógica de funções e referências de memória confunde 90% dos iniciantes. Nós preparamos uma apostila completa em PDF com todos esses conceitos explicados visualmente, com dezenas de exercícios resolvidos. Estude no seu ritmo, sem depender de internet.

Apostila Completa de PHP em PDF
📥 Quero Baixar a Apostila de PHP Agora

Nenhum comentário: