What does the =&
(equals-ampersand) assignment operator do in PHP?
Is it deprecated?
CARVIEW |
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about CollectivesTeams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about TeamsWhat does the =&
(equals-ampersand) assignment operator do in PHP?
Is it deprecated?
It's not deprecated and is unlikely to be. It's the standard way to, for example, make part of one array or object mirror changes made to another, instead of copying the existing data.
It's called assignment by reference, which, to quote the manual, "means that both variables end up pointing at the same data, and nothing is copied anywhere".
The only thing that is deprecated with =&
is "assigning the result of new
by reference" in PHP 5, which might be the source of any confusion. new
is automatically assigned by reference, so &
is redundant/deprecated in$o = &new C;
, but not in $o = &$c;
.
Since it's hard to search, note that =&
(equals ampersand) is the same as = &
(equals space ampersand) and is often written such that it runs into the other variable like $x = &$y['z'];
or $x = &$someVar
(ampersand dollar sign variable name). Example simplified from the docs:
$a = 3;
$b = &$a;
$a = 4;
print "$b"; // prints 4
Here's a handy link to a detailed section on Assign By Reference in the PHP manual. That page is part of a series on references - it's worth taking a minute to read the whole series.
It's two different operators. =
is assignment as you probably know. And &
means the variable should be accessed by reference rather than by value.
The symbol &
is used in various ways in PHP to represent operations with "references". The PHP manual has a section titled References Explained which every PHP programmer should read.
It's important to understand that references in PHP are not a data type, like a pointer, but a concept regarding how variables work. There is therefore no single meaning of &
- you should not read it as "make a reference" - it just means "something reference-y is happening here".
In particular, the syntax $a =& $b
, which can also be written $a = &$b
, represents assignment by reference. It binds two variables together, so that they both point at the same piece of data. Think of the &
as modifying the =
rather than modifying the $b
.
Once you've bound two variables together in this way, they are interchangeable - you can't say that "$a points to $b" or "$b points to $a":
$a =& $b;
$a = 42;
// both $a and $b will be 42
$b = 101;
// both $a and $b will be 101
You can also link more than two variables together as references, and again it doesn't matter which of the existing names you use on the right-hand side of the assignment:
$a =& $b;
$c =& $b;
$d =& $a;
$e =& $c;
// $a, $b, $c, $d, and $e now all point to the same data, interchangeably
However, if you put the same variable on the left-hand side, it breaks the existing link of that variable, and links it to something else:
$a =& $b;
// $a and $b are linked together
$a =& $c;
// $a is now linked to $c
// the value of $b doesn't change, but it is not linked to $a or $c
To "break" the link without making a new link, you can use the unset
keyword:
$a =& $b;
$c =& $a;
// $a, $b, and $c are all linked together
unset($a);
// $b and $c are still linked together, but $a is independent
Some descriptions refer to =&
as "creating or adding to a reference set". Perhaps it would have been better if it had been implemented as a function, like bind($a, $b)
to highlight that both arguments are affected by the operation.
$x = &$y['z'];
also has the effect of creating $y['z']
if it doesn't exist, and setting it to null
.
This prevents error messages that you might have wanted to read. I haven't found documentation on this yet; possibly new in 5.3, for all I know.