Passagem de Parâmetros por Valor e Referência no PHP

1 de agosto de 2022
Ronaldo B.

Neste artigo iremos aprender em detalhes qual é a diferença da passagem de parâmetros por valor e por referência no PHP 7.

Valor vs Referência

1 - Valor. Quando realizamos uma passagem de parâmetros baseada no valor, significa que uma função irá realizar suas operações baseado no valor do parâmetro informado para ela. Em outras palavras, o valor informado será alterado apenas no escopo da função. Essa é a maneira padrão de o PHP informar parâmetros.

2 - Referência. Quando realizamos uma passagem de parâmetros baseada na referência, significa que uma função irá realizar suas operações baseado na referência original do parâmetro. Em outras palavras, se informarmos uma variável para uma função, o valor dessa variável será alterada no escopo global. Para realizar essa passagem, basta adicionar um & (“E” comercial) antes do parâmetro informado.

O que acha de desenvolvermos um exemplo prático para entender melhor essa diferença?

Primeiro Exemplo

Iremos criar uma função que irá adicionar um texto a uma string já existente. Iremos chamar essa função de addNameToString(). Seu script será o seguinte:

function addNameToString($string) {

   $string .= ' - Novo Nome';

   return $string;

}

Explicando: essa função irá esperar uma string como parâmetro. Ela adicionará um novo texto a essa string e então a retornará com seu novo valor. Para testar se ela está funcionando, vamos criar uma variável antes dela que conterá um nome e então a informar como parâmetro para a função. O código final ficará assim:

<?php

$name = 'Hcode';

function addNameToString($string) {

	$string .= ' - Novo Nome';
	
	return $string;
	
}

echo addNameToString($name);

echo '<br/>';

echo $name;

Nós criamos a variável $name, a informamos para a função addNameToString() junto com o construtor echo, para já exibir o valor retornado pela função no navegador. Abaixo disso nós quebramos uma linha com a tag <br/> e definimos outro echo para ver qual é o valor original da variável. Vamos testar esse código no navegador. O resultado será o seguinte:

Resultado de nosso código no navegador.

A primeira linha mostra a nossa variável com seu valor alterado pela função. Contudo, veja que na linha debaixo o valor original da variável não mudou, continuou o mesmo, pois a função alterou apenas o valor isolado da variável $name.

Vamos agora desenvolver esse mesmo exemplo, mas usando a passagem de parâmetros por referência. Como aprendemos acima, basta informar o & antes do parâmetro $name na função addNameToString(). Seu código ficará assim:

function addNameToString(&amp;amp;$string) {

	$string .= ' - Novo Nome';

	return $string;

}

Perceba que a sintaxe não mudou muito. Qual será o resultado dessa mudança em nosso navegador? Quando atualizamos a página, vemos o seguinte:

Resultado de nosso código no navegador.

Agora as duas linhas retornam o valor alterado pela função. Ou seja, a variável $name teve o seu valor de fato alterado, pois a função trabalhou não com um valor isolado, mas com a referência do parâmetro, com a variável $name em si. Sensacional, não concorda? Conseguimos concluir assim que ao passar um parâmetro por valor, é como se tirássemos uma cópia do conteúdo de uma variável e o informássemos para a função de uma maneira separada. Mas, ao passar um parâmetro por referência, é como se informássemos para a função a variável por inteiro. Podemos dizer que o PHP conseguirá "entender a referência" ;).

Segundo Exemplo

A passagem de parâmetros pode ser muito usada também em laços de repetição. Vamos desenvolver um exemplo nesse contexto.

Iremos criar um array com alguns times da NBA e percorrer seus valores por meio de um foreach(). O código final ficará assim:

<?php

$nba_teams = ['Chicago Bulls', 'Los Angeles Lakers', 'Boston Celtics', 'New York Knicks'];

foreach ($nba_teams as $index => $team) {

	$team_number = $index + 1;
	
	$team = "#$team_number - $team";

	echo $team;
	
	echo "<br/>";
	
}

echo '<hr/>';

var_dump($nba_teams);

Explicação: criamos a variável $nba_teams, que é um array. Dentro do foreach(), que está percorrendo esse array, nós mudamos o valor de cada item, adicionando um número à sua frente, que será igual ao índice do array mais um. Iremos exibir cada novo valor dentro do foreach(). No final do código definimos um var_dump(), que exibirá os valores do array original. Entre eles haverá uma tag <hr/>, que criará uma linha de separação, facilitando a nossa visualização. Vamos executar esse código em nosso navegador. O resultado será o seguinte:

Resultado de nosso código no navegador.

Percebemos nas primeiras linhas que os nomes dos times foram alterados, adicionando um número antes deles. Entretanto, na última linha, vemos que o valor original permanece. Vamos agora alterar o foreach() para o conceito de parâmetros por referência, seguindo o mesmo padrão do exemplo anterior. Nosso laço de repetição ficará assim:

foreach ($nba_teams as $index => &amp;amp;$team) {

	$team_number = $index + 1;
	
	$team = "#$team_number - $team";

	echo $team;

	echo "<br/>";
}

O & foi adicionado na variável $team, que representa o nome de cada time, e que será de fato alterada. O resultado no navegador será este:

Resultado de nosso código no navegador.

Note que agora tanto os valores no laço de repetição como também no array original foram alterados, por causa da referência que informamos para o foreach().

Esperamos que esses dois exemplos tenham te ajudado a entender um pouco melhor a diferença entre a passagem de parâmetros por valor e por referência. Se você gostou desse conteúdo, pedimos que por favor compartilhe com outras pessoas, para que elas também possam ter acesso a essa dica.

Se desejar aprender mais sobre PHP, você pode conferir nosso Curso Completo de PHP 7 e se tornar um verdadeiro especialista nessa linguagem sensacional.

Até o próximo artigo!

Hcode: Utilizamos cookies para a personalização de anúncios e experiências de navegação dentro de nosso site. Ao continuar navegando, você concorda com as nossas Política de Privacidade.