PHP变量存储的一些个人理解

     

首先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却不行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值