Operador de atribuição de referência em PHP, = &

Respostas:

121

Não está obsoleto e é improvável que seja. É a maneira padrão de, por exemplo, fazer parte de um array ou espelho de objeto alterações feitas em outro, em vez de copiar os dados existentes.

Chama-se atribuição por referência , o que, para citar o manual, “significa que ambas as variáveis ​​acabam apontando para os mesmos dados, e nada é copiado para lado nenhum” .

A única coisa que está obsoleta =&é "atribuir o resultado de newpor referência" no PHP 5 , o que pode ser a fonte de qualquer confusão. newé atribuído automaticamente por referência, então &é redundante / obsoleto em $o = &new C;, mas não em $o = &$c;.


Como é difícil pesquisar, observe que =&( igual ao e comercial ) é o mesmo que = &( igual ao e comercial de espaço ) e geralmente é escrito de forma que vá para a outra variável como $x = &$y['z'];ou $x = &$someVar( nome da variável do símbolo de cifrão e comercial ). Exemplo simplificado da documentação:

$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4

Aqui está um link útil para uma seção detalhada sobre Atribuir por referência no manual do PHP . Essa página faz parte de uma série de referências - vale a pena reservar um minuto para ler a série inteira.

user56reinstatemonica8
fonte
8
observação lateral com referência a: "já que é difícil pesquisar" : symbolhound.com é seu amigo para coisas assim.
billynoah
1
@billynoah Uau! Symbolhound agora está permanentemente adicionado à minha caixa de ferramentas.
Parapluie
26

São dois operadores diferentes. =é uma atribuição como você provavelmente sabe. E &significa que a variável deve ser acessada por referência e não por valor.

Asaph
fonte
60
Sinto muito, mas isso é muito simplista. $ a = & $ b significa fazer com que a variável $ a se refira à mesma coisa que $ b faz agora. Depois disso, $ a = 5; também resultará em $ b com um 5. No entanto, o link de referência pode ser quebrado por $ b = & $ xyz; ou não definido ($ b); Nesse momento $ a será a única variável que sabe onde está a célula que contém o 5. Também tome cuidado se você definir $ a usando = &, você deve usar = & da próxima vez (ou remover ($ a)) para alterar o link de referência de $ a, especificamente $ a = NULL; não vai quebrar o link, ele apenas substitui o 5 por nulo;
Don,
8
@Don: Obrigado pela elaboração. Posso dizer que você é um programador C.
Asaph
8
Eu apoio o que Don diz. Mas eu não diria que isso é muito simplista. Eu diria que isso está errado.
Artefacto
@ Don você realmente deveria postar seu comentário como uma resposta.
Adam
6
$x = &$y['z'];

também tem o efeito de criar, $y['z']se não existir, e defini-lo como null.

Isso evita mensagens de erro que você pode querer ler. Não encontrei documentação sobre isso ainda; possivelmente novo no 5.3, pelo que sei.

Malcanso
fonte