Uma referência é um nome alternativo que permite que duas variáveis diferentes podem escrever para o mesmo valor. Existem três operações que podem ser executadas com referências: atribuir por referência, passar por referência e retornar por referência.
Atribuir por referência
A referência é atribuído pela colocação de um comercial (&) antes da variável que se encontra vinculado.
$x = 5; $r = &$x; // r é uma referência a x $s =& $x; // sintaxe alternativa
A referência torna-se então um alias para essa variável e pode ser usado exatamente como se fosse a variável original.
$r = 10; // atribuir valor a $r/$x echo $x; // "10"
Passar por referência
Em PHP, os argumentos da função são por padrão passados por valor. Isto significa que uma cópia local da variável é passada, por isso, se a cópia for alterado, ele não vai afetar a variável original.
function myFunc($x) { $x .= ' World'; } $x = 'Hello'; myFunc($x); // valor de x é passado echo $x; // "Hello"
Para permitir que uma função para modificar um argumento deve ser passado por referência. Isto é feito através da adição de um e comercial antes do nome do parâmetro na definição da função.
function myFunc(&$x) { $x .= ' World'; } $x = 'Hello'; myFunc($x); // referência para x é passado echo $x; // "Hello World"
Variáveis de objeto também são por padrão passados por valor. No entanto, o que realmente é passado é um ponteiro para os dados do objeto, não os dados em si. Assim, as alterações membros do objeto afetará o objeto original, mas substituindo a variável de objeto com o operador de atribuição só vai criar uma variável local.
class MyClass { public $x = 1; } function modifyVal($o){ $o->x = 5; $o = new MyClass(); // novo objeto local } $o = new MyClass(); modifyVal($o); // ponteiro para objeto é passado echo $o->x; // "5"
Em contraste, quando uma variável de objeto é passado por referência não só é possível alterar suas propriedades, mas também para substituir o objeto inteiro e ter a mudança de volta para propagar a variável de objeto original.
class MyClass { public $x = 1; } function modifyRef(&$o){ $o->x = 5; $o = new MyClass(); // Novo Objeto } $o = new MyClass(); modifyRef($o); // referência ao objeto é passado echo $o->x; // "1"
Retorno por referência
Uma variável pode ser atribuída a uma referência de uma função por ter essa função de retorno por referência. A sintaxe para retornar uma referência é colocar o comercial antes do nome da função. Em contraste com a passagem por referência, o “&” é também é usado ao chamar a função a fim de vincular a referência.
class MyClass{ public $val = 10; function &getVal(){ return $this->val; } } $obj = new MyClass(); $myVal = &$obj->getVal();
Tenha em mente que as referências não deve ser utilizado apenas por motivos de desempenho, como a engine dp PHP vai cuidar de tais otimizações por conta própria. Utilize apenas referências quando você tem uma necessidade de um comportamento do tipo de referência.