PHP通过引用/值传递 - 问题

时间:2011-08-22 11:39:22

标签: php

我打算向我们的实习生解释PHP中“pass by reference”和“pass by value”之间的区别,并做了这个简单的脚本:

$a=5; 
$b=&$a; 
$a=8; 
echo $b;
// prints  8
$a=5; 
$b=$a;  //no &
$a=8; 
echo $b;
// prints 5

但是,使用php -qa在php-cli中运行它会产生:

php >     $a=5; 
php >     $b=&$a; 
php >     $a=8; 
php >     echo $b;
8
php >     // prints  8
php >     $a=5; 
php >     $b=$a;  //no &
php >     $a=8; 
php >     echo $b;
8
php >     // prints 5

$b=$a;不应取消联系$ a和$ b吗?

...所以我得到了curius,并尝试了:

php > $b=3;
php > echo $a;
3

那么,我怎么弄错了?这里发生了什么?似乎参考设置以某种方式粘贴,即使它应该在$b=$a行清除?我也尝试过:

php >    $e=5; $f=$e; $e=6; echo $f; 
5

......哪个按预期工作。

$a$b似乎永久关联?我在这里错过了一些重点吗?如何“取消关联”$a$b变量?

6 个答案:

答案 0 :(得分:6)

如果为变量赋值,为什么要清除引用?它的工作原理如下(半简化评论):

$a = 5;    // creates a "slot", puts 5 in it, makes $a point to it
$b =& $a;  // makes $b point to the same "slot" $a points to
$c = 6;    // creates a "slot", puts 6 in it, makes $c point to it
$a = $c;   // puts the value of the slot $c points to into the slot $a points to
echo $b;   // outputs the value of the slot $b points to (6)

它将分配给变量。该值是 literal 5)还是由另一个变量保存的值无关紧要。引用会一直持续到unset($b)

答案 1 :(得分:1)

嗯,是的,因为您创建了$b作为对$a的引用。那么,你在线上做了什么:

$b = $a

只是将5分配给$ a,因为$b仍然引用$a

如果你想要“反对”它,你必须unset并重新创建变量。

答案 2 :(得分:0)

您的代码第一次使用$ b时,会创建变量$ b并将其链接到$ a的位置。随后,您将值写入共享位置。您无法撤消变量引用的位置。

答案 3 :(得分:0)

跟进我的评论...我运行了你的脚本 - 它在两种情况下输出'8'。我在第一个unset($b)之后添加echo并再次运行 - 现在输出为85,正如预期的那样。

答案 4 :(得分:0)

问题在于,当你执行$b = $a时,因为$ b是对$ a的引用,实际上你正在做$a = $a。正如其他人所说,你必须unset($b)

答案 5 :(得分:0)

也许使用更多的说法变量名称会让你更清楚:

$value = 5; 
$alias = &$value; 
$value = 8;
echo $alias;   # 8
$value = 5; 
$alias = $value; # no &
$value = 8;
echo $alias;   # 8 (OP expected 5)

这更容易阅读,对吧?

特别注意这一行:

$alias = $value; # no &

这里发生了什么?

由于$alias$value的别名,您基本上是在撰写:

$value = $value;

现阶段是5岁。

然后将$value设置为8。

$alias仍指$value

如果您想阻止$alias成为$value的别名,可以将其转换为其他内容的别名:

$alias = &$other;

或者只是取消设置引用:

unset($alias);