O que são referências

Referência em PHP significa acessar o mesmo conteúdo de variável através de vários nomes. Isto não é parecido com os ponteiros em C. Por exemplo não é possível efetuar aritmética de ponteiros com referências, já que elas não são endereços de memória. Veja O que referências não são para mais informações. Referências são como uma tabela de apelidos simbólicos. No PHP um nome de variável e o conteúdo de variável são diferentes, de forma um mesmo conteúdo pode ter nomes diferentes. A analogia mais próxima são com arquivos e nomes de arquivos Unix - os nomes de variáveis como nomes de arquivos, enquanto que o conteúdo das variáveis os conteúdos dos arquivos. Referências, assim, são como os hardlinks no sistema de arquivo Unix.

add a note add a note

User Contributed Notes 3 notes

273118949 at qq dot com
9 months ago
it just likes a person who has two different names.
1 year ago
In summary, "&$reference" means "do-not-copy-on-write the value here, in perpetuity". Assigning by reference is not assignment, it's "make &$variable a reference and its value do-not-copy-on-write, in perpetuity, and make the variable I'm assigning to use that do-not-copy-on-write value as well".

To "unreference/unalias" you have to either unset or make an explicit copy into a new variable.

Object properties that are references will survive cloning and remain references. Generally the same is true with references in arrays and PHP's array functions (combine, intersect, call_user_func, func_get_args, etc).

Calling a function that uses a reference parameter will *make* the supplied variable a reference. This is also true when using variadic array expansion for arguments; the supplier's array element will become a reference.

Generally, don't use them unless you're dealing with low-level calls, or need an accumulator, etc. For poorly designed functions that use them, give them a copy to mangle.
2 years ago
One subtle effect of PHP's assign-by-reference is that operators which might be expected to work with args that are references usually don't.  For example:

$a = ($b ? &$c : &$d);

fails (parser error) but the logically identical

if ($b)
   $a =& $c;
   $a =& $cd;

works. It's not always obvious why seemingly identical code throws an error in the first case. This is discussed on a PHP bug report ( https://bugs.php.net/bug.php?id=54740 ). TL;DR version, it acts more like an assignment term ($var1) "=&" ($var2) than a function/operator ($var1) "=" (&$var2).
To Top