PHP &变量问题?
怪我咯
怪我咯 2017-04-11 10:22:42
[PHP讨论组]

代码:

$a = 1;
$b = 2;
$v = &$a;
$v = $b;
echo $a."
"; echo $b."
"; echo $v;

结果:

2
2
2

怎么全是2??

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(7)
PHPz

你这需要了解指针的概念,你的代码翻译成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;
PHPz

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

阿神

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

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

ringa_lee

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

ringa_lee

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

阿神

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

引用不是什么

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

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

大家讲道理

这里面的学问大了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号