array ( 0 => 'index.php', 1 => 'PHP Manual', ), 'head' => array ( 0 => 'UTF-8', 1 => 'pt_BR', ), 'this' => array ( 0 => 'language.references.whatdo.php', 1 => 'O que as referências fazem', ), 'up' => array ( 0 => 'language.references.php', 1 => 'Referências', ), 'prev' => array ( 0 => 'language.references.whatare.php', 1 => 'O que são referências', ), 'next' => array ( 0 => 'language.references.arent.php', 1 => 'O que referências não são', ), 'alternatives' => array ( ), 'source' => array ( 'lang' => 'pt_BR', 'path' => 'language/references.xml', ), ); $setup["toc"] = $TOC; $setup["toc_deprecated"] = $TOC_DEPRECATED; $setup["parents"] = $PARENTS; manual_setup($setup); ?>
Há três operações básicas ao se utilizar referências: atribuição por referência, passagem por referência, e retorno por referência. Esta seção fará uma introdução dessas operações, com links para leituras posteriores.
Referências no PHP permitem criar duas variáveis que se referem ao mesmo conteúdo. Ou seja, quando você faz:
<?php
$a =& $b;
?>
Nota:
$a e $b são completamente iguais aqui, mas não porque $a está apontando para $b ou vice versa, mas sim que $a e $b apontam para o mesmo lugar.
Nota:
Se você atribuir, passar ou retornar uma variável indefinida por referência, ela irá ser criada.
Exemplo #1 Usando referência com variáveis indefinidas
<?php
function foo(&$var) { }
foo($a); // $a é "criada" e setada par null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new stdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
A mesma sintaxe pode ser utilizada com funções, que retornem referências:
<?php
$foo =& find_var($bar);
?>
Usar essa mesma sintaxe com uma função que não retorna por referência irá gerar um erro, da mesma forma no caso do operador new. Ainda que objetos sejam internamente passados como ponteiros, isso não é o mesmo que uma referência, como explicado em Objetos e Referências.
Se você atribuir uma referência para uma variável declarada global
dentro da função, a referência irá ser visível somente dentro da função.
Você pode evitar isso usando o array $GLOBALS.
Exemplo #2 Referenciando variáveis globais de dentro de funções
<?php
$var1 = "Example variable";
$var2 = "";
function global_references($use_globals)
{
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // visível somente dentro da função
} else {
$GLOBALS["var2"] =& $var1; // visível também no contexto global
}
}
global_references(false);
echo "var2 is set to '$var2'\n"; // var2 is set to ''
global_references(true);
echo "var2 is set to '$var2'\n"; // var2 is set to 'Example variable'
?>
global $var;
como atalho para $var
=& $GLOBALS['var'];
. Assim atribuir outra referência
para $var
somente modifica a variável de referência local.
Nota:
Se você atribuir um valor para uma variável com referência numa instrução foreach a referência também é modificada.
Exemplo #3 Referências e o comando foreach
<?php
$ref = 0;
$row =& $ref;
foreach (array(1, 2, 3) as $row) {
// faz alguma coisa
}
echo $ref; // 3 - último elemento do array iterado
?>
Ainda que não seja uma atribuição por referência explícita, expressões criadas
com o constructo
array()
também podem
se comportar como tais com o prefixo &
no elemento de array
a ser acrescentado. Exemplo:
<?php
$a = 1;
$b = array(2, 3);
$arr = array(&$a, &$b[0], &$b[1]);
$arr[0]++; $arr[1]++; $arr[2]++;
/* $a == 2, $b == array(3, 4); */
?>
Note que referências dentro de arrays são potencialmente perigosas. Fazer uma atribuição normal (sem referência) com uma referência à direita não transforma a expressão a esquerda numa referência, mas referências dentro de arrays são preservadas nessas atribuições normais. Isso também se aplica a chamadas de função onde arrays são passados por valor. Exemplo:
<?php
/* Atribuição de variáveis escalares */
$a = 1;
$b =& $a;
$c = $b;
$c = 7; //$c não é referência; não modifica $a ou $b
/* Atribuição de variaveis do array */
$arr = array(1);
$a =& $arr[0]; //$a e $arr[0] estão no mesmo conjunto de referências
$arr2 = $arr; //não atribui por referência!
$arr2[0]++;
/* $a == 2, $arr == array(2) */
/* O conteúd de $arr foi modificado mesmo que ele não seja uma referência! */
?>
A segunda coisa que referências fazem é passar variáveis por referência. Isso é feito com a criação de uma variável local em uma função e uma variável no escopo chamador que referenciam o mesmo conteúdo. Assim:
<?php
function foo(&$var)
{
$var++;
}
$a=5;
foo($a);
?>
A terceira coisa que as referências fazem é retorno por referência.