扫码关注官方订阅号
代码:
$a = 1; $b = 2; $v = &$a; $v = $b; echo $a.""; echo $b.""; echo $v;
结果:
2 2 2
怎么全是2??
走同样的路,发现不同的人生
你这需要了解指针的概念,你的代码翻译成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 隐藏的指针的概念,并且在概念上 *pointer 和 pointer 混淆,所以造就了很多初学者不懂PHP的指针操作
*pointer
pointer
楼下已经拿出PHP手册作为反例来说明PHP的引用并不是指针,其实这就是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
$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;
&是取地址运算符$v = &$a; 这时$v就是$a变量在内在中的存储地址,$v改变$a同样会改变,因为是一个地址$v = $b; 这个地址里的值为$b也就是2
&是引用 PHP 的引用允许你用两个变量来指向同一个内容
$a $v 指向的是同一个内容
php中有引用传递和值传递两种方式,简单的说 $a = $b就说明给a赋值为b,但是b之后值的更改和a无关,a不会因为b的更改而更改,而$a = &$b就不一样了,它是引用传递,也就说一旦这样赋值了,他们两个就会指向同样的地址空间,无论谁改都是改的地址空间,另一个也会跟着变,所以上面这个例子 先是值传递,a和v都等于1,并且指向同样的地址空间,然后为a赋值2,地址空间变了,所以指向同样地址空间的a和v都变成了2
$a = $b
$a = &$b
$b=&$a 是指向a的地址相当于谁给$b赋值 什么的,都是只会修改$a的值,
说指针的全是误人子弟, 手册上写的很清楚,引用不是指针.
引用不是什么
在php中, 变量名是变量名, 变量值是变量值, 变量值是存在zval中的, 然后把变量名当key, 把变量值当value存在hash table中的.
php
zval
key
value
hash table
而引用赋值则是让两个变量名指向同一个zval, 所以$v=&$a, 其实就是让$v和$a指向同一个zval.再执行$v=$b就是普通赋值了, 对$v指向的zval进行赋值, 那又因为它们是指向同一个zval, 所以全是2.
$v=&$a
$v=$b
这里面的学问大了
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
你这需要了解指针的概念,你的代码翻译成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 的引用允许你用两个变量来指向同一个内容
$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的值,
说指针的全是误人子弟, 手册上写的很清楚,引用不是指针.
引用不是什么
在
php中, 变量名是变量名, 变量值是变量值, 变量值是存在zval中的, 然后把变量名当key, 把变量值当value存在hash table中的.而引用赋值则是让两个变量名指向同一个
zval, 所以$v=&$a, 其实就是让$v和$a指向同一个zval.再执行
$v=$b就是普通赋值了, 对$v指向的zval进行赋值, 那又因为它们是指向同一个zval, 所以全是2.这里面的学问大了