我想了解通过引用传递。这可能是一个不好的类比,但它是否像牛顿第三定律(动作 - 反应对)?
例如,对于下面的代码
$a = 4;
$b = 2;
$n = 42;
$a = &$b;
是
$a=$n
一样$b=$n
? $a
和$b
的值是否存储在相同的地址中?
我想了解通过引用传递。这可能是一个不好的类比,但它是否像牛顿第三定律(动作 - 反应对)?
例如,对于下面的代码
$a = 4;
$b = 2;
$n = 42;
$a = &$b;
是
$a=$n
一样$b=$n
? $a
和$b
的值是否存储在相同的地址中?
如果分配通常这些变量:
$a = 1;
$b = 2;
$c = 3;
然后协会将看起来像这个:
a --> 1
b --> 2
c --> 3
现在,如果你让$c
int邻$a
的引用,像这样:
$a = 1;
$b = 2;
$c = &$a;
然后,关联将看起来像这样:
a --> 1 <--.
b --> 2 |
c --------/
换言之,$a
和$c
点为相同的值。因为它们都指向相同的值,所以我们可以更改任一变量,并且它们都指向新值。
$a = 5;
echo "$a $c"; // Output: "5 5"
$c = 10;
echo "$a $c"; // Output: "10 10"
是,分配$n
到$a
后,$b
将指向$n
。
这是因为执行$a=&$b
既$a
和$b
引用相同的存储器位置后,成为参考变量(is_ref=1
)。并且该特定内存位置的引用计数(refcount
)增加1
。 现在无论值您分配给任何这些引用都将指向相同的值。
执行$a=$n
装置的$n
值将存储于由$a
引用的位置。这与$b
的位置相同。
请看这里的例子。
$a
,$b
,$n
指向不同的位置
php > $a = 4;
php > $b = 2;
php > xdebug_debug_zval('a'); // they are pointing different location
a: (refcount=1, is_ref=0)=int(4)
php > xdebug_debug_zval('b'); // they are pointing different location
b: (refcount=1, is_ref=0)=int(2)
php > $n = 42;
php > xdebug_debug_zval('n');
n: (refcount=1, is_ref=0)=int(42)
$ a和$b
都变成了现在参考
php > $a = &$b;
php > xdebug_debug_zval('b');
b: (refcount=2, is_ref=1)=int(2)
php > xdebug_debug_zval('a'); // a too
a: (refcount=2, is_ref=1)=int(2)
分配新值,而不是任何的$a
和$b
引用
php > $a = $n;
php > xdebug_debug_zval('a'); // a holds $n's value '42' now
a: (refcount=2, is_ref=1)=int(42)
php > xdebug_debug_zval('b'); // same for b
b: (refcount=2, is_ref=1)=int(42)
$a = $b
& $b = $n
具有相同的值,但不同,因为该值是原始类型,并且primitive types pass by value
。
测试代码是否使用引用的最快速方法是更改源var的值并查看目标vars是否更改其值。
$n = 1;
$a = $n;
$b = $n;
echo $a; // 1
echo $b; // 1
echo $n; // 1
$n = 2;
echo $a; // 1
echo $b; // 1
echo $n; // 2
然而objects always are passed by reference
$n = new Object(1);
$a = $n;
$b = $n;
$n->newValue(5);
$a->printValue(); // 5
$b->printValue(); // 5
$a->newValue(7);
$b->printValue(); // 7
-1对象不在此处。其他部分根本不回答这个问题。 –
通常当你创建一个变量$a
和$b
,每个人都有,他们的数据存储在唯一的存储地址。
但是,如果你告诉口译员那个$a = &$b
,这意味着$ a和$ b现在有相同的内存地址。如果将任何内容分配给$ a或$ b,它们都会回显相同的值,因为它们将数据存储在内存中的相同位置。
如果你想尝试,我建议启动命令行的PHP交互式解释:
php -a
php > $a = 1;
php > $b = 2;
php > echo $a . ' ' . $b;
1 2
php > $a = &$b;
php > echo $a . ' ' . $b;
2 2
php > $a = 1;
php > echo $a . ' ' . $b;
1 1
php > $b = 2;
php > echo $a . ' ' . $b;
2 2
使用http://php.net/manual/en/language.references.pass.php阅读有关它.. –
我看不出有什么“过客”在这里 – Eric
显式地传递通过引用过时的值,不能用实际的PHP版本来做。只有一种方法可以定义参数是否必须通过引用 – Maks3w