代码:
$a = 1;
$b = 2;
$v = &$a;
$v = $b;
echo $a."<br />";
echo $b."<br />";
echo $v;
结果:
2
2
2
怎么全是2??
代码:
$a = 1;
$b = 2;
$v = &$a;
$v = $b;
echo $a."<br />";
echo $b."<br />";
echo $v;
结果:
2
2
2
怎么全是2??
References in PHP are a means to access the same variable content by different names. They are not like C pointers;
值得指出的是,注意加粗的部分,可能和楼上的说的有点不一样。他们并不像C的指针。
<?php
$a =& $b;
?>
it means that $a and $b point to the same content.
这意味着 $a 和 $b 指向了同一个变量。
$a and $b are completely equal here. $a is not pointing to $b or vice versa. $a and $b are pointing to the same place.
$a $b是完全相同的,并不是$a指向了$b或者$b指向了$a。是他们同时指向了同一个地方。
即:PHP 的引用允许用两个变量来指向同一个内容。这里跟C里面的指针还是不一样的。
如果要知道具体PHP如何实现&操作符,看这里PHP的C源代码吧: https://github.com/php/php-src。反正我还看不懂,我就不帮你翻译了。
另外:在C里面&可以理解为取地址符号,
#include <stdio.h>
int main() {
int a = 1;
int *p = &a;
printf("%p \r\n", &p); //我程序输出 0x7fff5108ba90
}
结果
会输出p的地址。
但是在PHP里面
$a = 1;
echo &$a;
会报syntax error
说指针的全是误人子弟, 手册上写的很清楚,引用不是指针.
在php
中, 变量名是变量名, 变量值是变量值, 变量值是存在zval
中的, 然后把变量名当key
, 把变量值当value
存在hash table
中的.
而引用赋值则是让两个变量名指向同一个zval
, 所以$v=&$a
, 其实就是让$v
和$a
指向同一个zval
.
再执行$v=$b
就是普通赋值了, 对$v
指向的zval
进行赋值, 那又因为它们是指向同一个zval
, 所以全是2.
php中有引用传递和值传递两种方式,简单的说 $a = $b
就说明给a赋值为b,但是b之后值的更改和a无关,a不会因为b的更改而更改,而$a = &$b
就不一样了,它是引用传递,也就说一旦这样赋值了,他们两个就会指向同样的地址空间,无论谁改都是改的地址空间,另一个也会跟着变,所以上面这个例子 先是值传递,a和v都等于1,并且指向同样的地址空间,然后为a赋值2,地址空间变了,所以指向同样地址空间的a和v都变成了2
1 回答4.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.2k 阅读
1 回答585 阅读✓ 已解决
791 阅读
你这需要了解指针的概念,你的代码翻译成C的话是这样的
楼下已经拿出
PHP手册
作为反例来说明PHP的引用
并不是指针,其实这就是PHP混淆这两则的概念引发的一些问题,PHP
的&
主要应用在如下场景:$a = &$b;
function func(&$a)
我们简单点,无需指针的概念:你只要知道这2点:
$v = &$a;
表示把$a
的内存地址赋值给$v
,你对
$v
的任何赋值操作,等同于对$a
的操作比如下例: