В чем разница между «=» и «= &» при назначении переменных? - PullRequest
4 голосов
/ 24 июля 2010

Я пытаюсь выяснить разницу между $a=&$b и $a=$b. Я знаю & сделать переменную в качестве ссылочной переменной. Но следующий тест дал мне тот же результат. Кто-нибудь может объяснить разницу? Спасибо.

 $a=5;
 $b=6;

 $a=&$b;
 echo $a; //6


 $a=5;
 $b=6;

 $a=$b;
 echo $a; //6

Ответы [ 6 ]

13 голосов
/ 24 июля 2010

Прежде всего: вам вряд ли понадобятся ссылки, по возможности избегайте путаницы при их использовании.

$a=5;    //assign value to a
$b=&$a;  //make $b a reference to $a
$b=6;    //assigning a value to $b assigns the same value to $a (as they point to the same location
echo $a; //6


$a=5;    //assign a value to a
$b=$a;   //set $b to the value of $a
$b=6;    //set $b to another value leaves $a at it's original value
echo $a; //5
1 голос
/ 24 июля 2010

Ссылка может быть легко объяснена простым графиком.Когда вы используете копирование по значению ($a = $b), происходит нечто подобное:

$a = 1000;

# $a -----> 1000

$b = $a;

# $a -----> 1000
# $b -----> 1000
# (two "pieces of memory" has been used)

Но когда вы создаете новую ссылку на $a с именем $b, то что-то вродечто происходит:

$a = 1000;
$b =& $a;

# $a --\
#       --> 1000
# $b --/
# (one "piece of memory" has been used but two different names ($a, $b) point on it)
1 голос
/ 24 июля 2010

Когда вы используете & в назначении, вы можете думать, что новая переменная является «кратчайшим» по отношению к оригиналу.Если вы не используете &, это будет «копия» оригинала.

$a = 5;
$b =& $a; // this $b is like a shortcut to $a. Change $b and $a will change too

$a = 5;
$b = $a; // this time, $b will be 5 - but not a shortcut to $a. Change $b and $a will still be 5.
1 голос
/ 24 июля 2010

Разница между $a = $b и $a =& $b заключается в том, что с первым оператором присваивания значение копируется, а с последним опорным оператором переменная $a ссылается на то же значение $b.

Вы не видите никакой разницы при чтении значения, но вы видите его при записи значения:

$var = 123;
$copyOfVar = $var;
$referenceToVar =& $var;

$copyOfVar = 456;
echo 'var='.$var.'; copyOfVar='.$copyOfVar;
// "var=123; copyOfVar=456"

$referenceToVar = 456;
echo 'var='.$var.'; referenceToVar='.$referenceToVar;
// "var=456; referenceToVar=456"
1 голос
/ 24 июля 2010

Вы получите ответ, если вы будете следовать следующему коду (я добавил несколько строк)

$a=5;
$b=6;

$a=&$b;
echo $a; //6

$b = 8;
echo $a; //8

$a=5;
$b=6;

$a=$b;
echo $a; //6

$b = 20;
echo $a; //6

с & простой переменной $a указывает на переменную $b

без &, $b просто скопируйте в $a

1 голос
/ 24 июля 2010

Это имеет большее значение в функции при отправке в качестве параметра.

Например:

<?php
function changeVariableWithReference(&$var)
{
  $var += 1;
}

function changeVariableWithoutReference($var)
{
  $var += 1;
}

$a = 5;
$b = 5;

changeVariableWithReference($a);
changeVariableWithoutReference($b);

print $a . ' ' . $b;

?>
...