PHP变量的值类型和引用类型
PHP变量在内存中保存的并不直接是值的内容而是值的地址,比如:
$a = 1;
1
从表面上看起来似乎是$a
直接存储了1这个值,但是实际情况是,PHP解释器创建了变量$a
,将值1存入内存中的某个地方,再将值的地址存到变量中,需要取值时,先找到变量中$a
的地址,再根据地址找到变量的值。
比如:
echo $a;
1
当我们执行上面这个语句时,会输出1 ,但是PHP解释器会完成这样一段代码:找到$a中存储的地址(即:先取$a
的地址),根据地址找到存在内存中某个地方的值,最后输出。
用代码表示一下这个过程:
$a = 1;
$b = &$a;
1
2
2
我们看到上面出现了一个&
符号,这个符号是取地址符,可以取出变量$a
中存的地址,并存储到变量$b中,再使用输出语句:
echo $b;
1
结果也是输出1 ,PHP 解释器先取出$b
中存的地址,再根据地址找到值。下面我们再做一个演示:
$a = 1;
$b = &$a;
$a = 2;
echo $b;
1
2
3
4
2
3
4
会发现改变$a
的值,$b
的值也跟着改变了,其实改变$b
的值,$a的值也会随着改变。
到这一步,我们能确定的是在$a
和$b
中存储了相同的地址,所以,他们指向的值也是一样的。
结论1:如果两个变量存储了相同的地址,它们就是同一个变量。
下面我们来看一下值类型和引用类型。
先看一段代码:
$a = 1;
$b = $a;
$a = 2;
echo $b; // 输出 1
1
2
3
4
2
3
4
将$a
赋值给$b
,改变$a
的值,$b
的值不变,根据上面我们得到的结论,$a
和$b
是两个不同的变量,指向不同的地址。
结论2:赋值时会创建不同的变量的形式称之为值类型。
再看一段代码:
class User {
public $name = "Tome";
}
$a = new User();
$b = $a;
$a->name = "Joe";
echo $b->name;// 输出 Joe
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
在这里我们同样把$a
的值赋值给$b
,改变$a
后,$b
的值也跟着发生了变化,根据结论1我们知道$a
和$b
是同一个变量,指向相同的地址。
结论3:赋值时不会创建新的变量的形式称之为引用类型。
# 总结
在PHP中字符串、整型、浮点、数组等这些都是值类型,而类和对象是引用类型。
上次更新: 2022/12/02, 22:04:34