PHP &变量问题?

发布于 2022-09-04 17:28:03 字数 235 浏览 19 评论 0

代码:

$a = 1;
$b = 2;
$v = &$a;
$v = $b;
echo $a."<br />";
echo $b."<br />";
echo $v;

结果:

2
2
2

怎么全是2??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

北笙凉宸 2022-09-11 17:28:03

你这需要了解指针的概念,你的代码翻译成C的话是这样的

int a = 1;
int b = 2;
int * v = & a; //指针v 指向 a 的地址
*v = b; // *v 赋值为 b 的值 也就是2,等同于 a = b的意思
print a;
print b;
print *v;

PHP 隐藏的指针的概念,并且在概念上 *pointerpointer 混淆,所以造就了很多初学者不懂PHP的指针操作

楼下已经拿出PHP手册作为反例来说明PHP的引用并不是指针,其实这就是PHP混淆这两则的概念引发的一些问题,PHP&主要应用在如下场景:

  • $a = &$b;

    C语言中这么写,就是将内存地址传递给一个指针,因为PHP没有指针变量,而导致大家认为 $a 是一个变量
    并且还可以无缝 echo $a,造成歧义,因为在C里面需要,echo *$a;
    虽然C语言的实现方式和PHP肯定有差异,并且PHP还有ZVal的HashMap封装,但是用C的指针去理解上面的表达式,会更加方便和直接
    
  • function func(&$a)

    这个等同C语言,是传址的含义,不过C语言里面有更方便的指针可以传入
    

我们简单点,无需指针的概念:你只要知道这2点:

  • $v = &$a; 表示把 $a 的内存地址赋值给 $v

  • 你对$v的任何赋值操作,等同于对$a的操作

比如下例:

$a = 0;
$v = &$a;
$v1 = &$a;

$v = 123;
echo $a;  //123

$v1 = 234;
echo $a;  //234

$b = 000;
function foo(&$param) {
    $param = 123;
}
foo($b);
echo $b; //123;
你怎么这么可爱啊 2022-09-11 17:28:03

&是取地址运算符
$v = &$a; 这时$v就是$a变量在内在中的存储地址,$v改变$a同样会改变,因为是一个地址
$v = $b; 这个地址里的值为$b也就是2

恋竹姑娘 2022-09-11 17:28:03

References in PHP are a means to access the same variable content by different names. They are not like C pointers;

摘自 PHP官方文档-引用是什么

值得指出的是,注意加粗的部分,可能和楼上的说的有点不一样。他们并不像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

翻了热茶 2022-09-11 17:28:03

说指针的全是误人子弟, 手册上写的很清楚,引用不是指针.

引用不是什么

php中, 变量名是变量名, 变量值是变量值, 变量值是存在zval中的, 然后把变量名当key, 把变量值当value存在hash table中的.

而引用赋值则是让两个变量名指向同一个zval, 所以$v=&$a, 其实就是让$v$a指向同一个zval.
再执行$v=$b就是普通赋值了, 对$v指向的zval进行赋值, 那又因为它们是指向同一个zval, 所以全是2.

无畏 2022-09-11 17:28:03

&是引用 PHP 的引用允许你用两个变量来指向同一个内容

$a $v 指向的是同一个内容

风渺 2022-09-11 17:28:03

php中有引用传递和值传递两种方式,简单的说 $a = $b就说明给a赋值为b,但是b之后值的更改和a无关,a不会因为b的更改而更改,而$a = &$b就不一样了,它是引用传递,也就说一旦这样赋值了,他们两个就会指向同样的地址空间,无论谁改都是改的地址空间,另一个也会跟着变,所以上面这个例子 先是值传递,a和v都等于1,并且指向同样的地址空间,然后为a赋值2,地址空间变了,所以指向同样地址空间的a和v都变成了2

画骨成沙 2022-09-11 17:28:03

$b=&$a 是指向a的地址
相当于谁给$b赋值 什么的,都是只会修改$a的值,

拥抱没勇气 2022-09-11 17:28:03

这里面的学问大了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文