首先PHP中动态变量(除了对象变量)都是存储在栈中的(感觉和javascript类似),
例如 $a = 'a'; $b = 23;在栈中存储如图
栈
$a 'a' |
$b 23 |
而在对象变量中,对象实例是保存在堆中的。虽然PHP是弱类型语言,定义变量时不需要给变量定义类型。实际上在内存中分配空间时,会根据变量类型为它分配空间。由于字符串,数字,布尔类型等所占用的空间大小是固定的 所以可将这些类型的动态变量存储在栈中。而object类型的变量,由于大小不固定,所以无法将它存储在栈中,所以只能将它存储在堆中。而在栈中则存储指向堆内存的地址。
PHP中,变量传值时,一般是值传递。如$a = 123;$b = $a; $a = 2; echo $b;此时$b为123;但是在对象传值时,则是引用传递。
class a{
public $a ='a';
}
$a = new a();
$b = $a;
$a->a ='b';
echo $b->a ;这个时候则是输出b;
实际上在PHP中,对象变量赋值是,是将栈中的地址赋值给$b,然后B就指向了堆中同一个对象。
这跟引用传递不同的地方在于 &引用传递相当于起个别名,2个变量完全是一回事。
举个例子
$a = new a();
$b = $a;
$c = &$a;
unset($a);
echo $b->a;
echo $c->a;
这时发现b还是能输出,而c却不行。