扫码关注官方订阅号
代码:
$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
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
&是引用 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-2025 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官方文档-引用是什么
值得指出的是,注意加粗的部分,可能和楼上的说的有点不一样。他们并不像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 的引用允许你用两个变量来指向同一个内容
$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.这里面的学问大了