PHP &变量问题?
代码:
$a = 1;
$b = 2;
$v = &$a;
$v = $b;
echo $a."<br />";
echo $b."<br />";
echo $v;
结果:
2
2
2
怎么全是2??
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
代码:
$a = 1;
$b = 2;
$v = &$a;
$v = $b;
echo $a."<br />";
echo $b."<br />";
echo $v;
结果:
2
2
2
怎么全是2??
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(8)
你这需要了解指针的概念,你的代码翻译成C的话是这样的
楼下已经拿出
PHP手册
作为反例来说明PHP的引用
并不是指针,其实这就是PHP混淆这两则的概念引发的一些问题,PHP
的&
主要应用在如下场景:$a = &$b;
function func(&$a)
我们简单点,无需指针的概念:你只要知道这2点:
$v = &$a;
表示把$a
的内存地址赋值给$v
,你对
$v
的任何赋值操作,等同于对$a
的操作比如下例:
&是取地址运算符
$v = &$a; 这时$v就是$a变量在内在中的存储地址,$v改变$a同样会改变,因为是一个地址
$v = $b; 这个地址里的值为$b也就是2
摘自 PHP官方文档-引用是什么
值得指出的是,注意加粗的部分,可能和楼上的说的有点不一样。他们并不像C的指针。
这意味着 $a 和 $b 指向了同一个变量。
$a $b是完全相同的,并不是$a指向了$b或者$b指向了$a。是他们同时指向了同一个地方。
即:PHP 的引用允许用两个变量来指向同一个内容。这里跟C里面的指针还是不一样的。
如果要知道具体PHP如何实现&操作符,看这里PHP的C源代码吧: https://github.com/php/php-src。反正我还看不懂,我就不帮你翻译了。
另外:在C里面&可以理解为取地址符号,
结果
会输出p的地址。
但是在PHP里面
会报syntax error
说指针的全是误人子弟, 手册上写的很清楚,引用不是指针.
引用不是什么
在
php
中, 变量名是变量名, 变量值是变量值, 变量值是存在zval
中的, 然后把变量名当key
, 把变量值当value
存在hash table
中的.而引用赋值则是让两个变量名指向同一个
zval
, 所以$v=&$a
, 其实就是让$v
和$a
指向同一个zval
.再执行
$v=$b
就是普通赋值了, 对$v
指向的zval
进行赋值, 那又因为它们是指向同一个zval
, 所以全是2.&是引用 PHP 的引用允许你用两个变量来指向同一个内容
$a $v 指向的是同一个内容
php中有引用传递和值传递两种方式,简单的说
$a = $b
就说明给a赋值为b,但是b之后值的更改和a无关,a不会因为b的更改而更改,而$a = &$b
就不一样了,它是引用传递,也就说一旦这样赋值了,他们两个就会指向同样的地址空间,无论谁改都是改的地址空间,另一个也会跟着变,所以上面这个例子 先是值传递,a和v都等于1,并且指向同样的地址空间,然后为a赋值2,地址空间变了,所以指向同样地址空间的a和v都变成了2$b=&$a 是指向a的地址
相当于谁给$b赋值 什么的,都是只会修改$a的值,
这里面的学问大了