2013-01-15 37 views
4

我想了解通过引用传递。这可能是一个不好的类比,但它是否像牛顿第三定律(动作 - 反应对)?

例如,对于下面的代码

$a = 4; 
$b = 2; 
$n = 42; 
$a = &$b; 

$a=$n一样$b=$n$a$b的值是否存储在相同的地址中?

+0

使用http://php.net/manual/en/language.references.pass.php阅读有关它.. –

+0

我看不出有什么“过客”在这里 – Eric

+0

显式地传递通过引用过时的值,不能用实际的PHP版本来做。只有一种方法可以定义参数是否必须通过引用 – Maks3w

回答

4

如果分配通常这些变量:

$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" 
1

,分配$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) 
+0

您的文本探测错误,与您的示例不符。 “执行$ a = $ n表示$ n的值将被存储到$ a引用的位置,并且这与$ b的位置相同。”并在稍后的“分配新值,而不是引用任何$ a和$ b” – Maks3w

+0

@ Maks3w这里哪个部分是错误的? “ –

+0

”这与$ b的位置相同。 $ a在新的内存空间 – Maks3w

-1

$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 
+0

-1对象不在此处。其他部分根本不回答这个问题。 –

0

通常当你创建一个变量$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 
相关问题