PHP变量的值类型和引用类型

PHP变量在内存中保存的并不直接是值的内容而是值的地址,比如:

1
$a = 1;

从表面上看起来似乎是$a直接存储了1这个值,但是实际情况是,PHP解释器创建了变量$a,将值1存入内存中的某个地方,再将值的地址存到变量中,需要取值时,先找到变量中$a的地址,再根据地址找到变量的值。

比如:

1
echo $a;

当我们执行上面这个语句时,会输出1 ,但是PHP解释器会完成这样一段代码:找到$a中存储的地址(即:先取$a的地址),根据地址找到存在内存中某个地方的值,最后输出。

用代码表示一下这个过程:

1
2
$a = 1;
$b = &$a;

我们看到上面出现了一个&符号,这个符号是取地址符,可以取出变量$a中存的地址,并存储到变量$b中,再使用输出语句:

1
echo $b;

结果也是输出1 ,PHP 解释器先取出$b 中存的地址,再根据地址找到值。下面我们再做一个演示:

1
2
3
4
$a = 1;
$b = &$a;
$a = 2;
echo $b;

会发现改变$a的值,$b的值也跟着改变了,其实改变$b的值,$a的值也会随着改变。

到这一步,我们能确定的是在$a$b中存储了相同的地址,所以,他们指向的值也是一样的。

结论1:如果两个变量存储了相同的地址,它们就是同一个变量。

下面我们来看一下值类型引用类型

先看一段代码:

1
2
3
4
$a = 1;
$b = $a;
$a = 2;
echo $b; // 输出 1

$a赋值给$b,改变$a的值,$b的值不变,根据上面我们得到的结论,$a$b是两个不同的变量,指向不同的地址。

结论2:赋值时会创建不同的变量的形式称之为值类型

再看一段代码:

1
2
3
4
5
6
7
8
9
class User {
public $name = "Tome";
}

$a = new User();
$b = $a;
$a->name = "Joe";

echo $b->name;// 输出 Joe

在这里我们同样把$a的值赋值给$b,改变$a后,$b的值也跟着发生了变化,根据结论1我们知道$a$b是同一个变量,指向相同的地址。

结论3:赋值时不会创建新的变量的形式称之为引用类型。

总结

在PHP中字符串、整型、浮点、数组等这些都是值类型,而类和对象是引用类型。

有用就打赏一下作者吧!