PHP:如何复制引用变量

10

如果我复制一个引用变量,新变量是指针还是持有原来指针所指变量的值?


引用不是指针。请参阅http://php.net/manual/zh/language.references.arent.php。 - Artefacto
有时候你必须使用它们,例如在实现offsetget时。虽然毫无疑问,在PHP中引用是一团糟。 - Artefacto
3个回答

8

让我们来进行一个快速测试:

<?php

$base = 'hello';
$ref =& $base;
$copy = $ref;

$copy = 'world';

echo $base;

输出结果是 hello,因此$copy不是指向%base的引用。


2
可以预期的是,“$ref”指向“$base”的关键在于“$copy = $ref”应该具有与“$copy = $base”完全相同的效果。 - Tgr
这让我更好地理解了引用。出于某种原因,我以为要复制一个引用,你可以使用 $copy = $ref;。现在我明白了,这就像是一个取消引用并复制引用所指向的数据。我认为使用C指针会让这变得混乱,因为你必须手动取消引用。 - Lightbulb1
@Lightbulb1:那是因为PHP的引用更像C++的引用而不是C/C++指针。 ;) - Crozin
指针和引用非常令人困惑。我觉得我快理解了,哈哈。 - Lightbulb1

8

它保存了值。如果你想要指向另一个引用,请使用&运算符复制另一个引用:

$a = 'test';
$b = &$a;
$c = &$b;

1
不要说“指针”。他会认为$a、$b和$c之间有一些区别(比如指针和被指的)。 - Artefacto

-1

让我举个例子来把这个问题解释清楚:

$a = array (1,2,3,4);
foreach ($a as &$v) {

}
print_r($a);

foreach ($a as $v) {
  echo $v.PHP_EOL;
}
print_r($a);

输出:

Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 4
)

1
2
3
3

Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 3
)

1
你的例子是故意混淆人心的。在 foreach ($anything as &$v) {} 之后,变量 $v 将持有最后一个数组元素的引用(虽然这很令人困惑,但这是正确的行为),你应该要么 unset($v) 要么记住 $v 是一个引用。专业提示:使用 var_dump() 而不是 print_r(),它将显示数组中的 & 引用 - Sanya_Zol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接