PHP变量传值赋值和引用赋值,变量销毁

    $a = 100;
    $b = 200;

php中,上面代码中变量是怎么存放的呢?

此时若将b赋值给a,即

 传值赋值 $a = $b; 和 引用赋值$a = &$b; 有什么区别呢?

 

 传值赋值就是复制过去,然后各玩各的,互不影响。

引用赋值是两个变量指向一个盒子,一旦这样,一改俱改。

这样赋予变量a的就不仅仅是变量b的值,而是变量b的地址,变量a和变量b共同指向一个地址。

 

 1     $a = 100;
 2     $b = 200;
 3     
 4     $a = &$b; //变量a的指针指向变量b的数据盒子
 5     var_dump($a,$b); //int(200) int(200)
 6     
 7     /*变量b引用赋值给变量a后,ab指向同一个地址,将会一改俱改,如下:*/
 8     $a =500; 
 9     var_dump($a,$b); //int(500) int(500)    一改俱改: 改a也改了b
10     $b = 700;
11     var_dump($a,$b); //int(700) int(700)    一改俱改: 改b也改了a
12 
13     $c = 900;
14     $a = $c;
15     var_dump($a,$b); //int(900) int(900)    一改俱改:其他变量值复制给a,等同于直接改了盒子里的数据
16 
17     $d = 1111;
18     $a = &$d;
19     var_dump($a,$b); //int(1111) int(900)  这里没有一改俱改,$a = &$d;是把变量d引用赋值给变量a,变量a指向了新地址,变成了新值1111,变量b还是指向老地址不变。 

 

 

 

 

<?php
/*理解下面的话*/

$a = 100; 
//变量a赋值int 100 ,100是基础数据类型,不是变量,新建一个盒子,里面存放int 100,让a指向它

$a = $b;
//变量b的值 赋值 给变量a,变量a,b各有各的指向,执行之后,各是各的。

$a = &$b;
//变量b的值的地址 赋值给变量 a ,变量a,b共用一个地址哦!一改俱改!


?>

 

销毁变量用unset

在php中,变量占据了两个地方,1.花名册中占个名字   2.存储其值的“盒子”(其实就是内存中一块地方)。

unset($a) ;会发生什么?

首先,会将$a这个变量扔出花名册,于是没有这个变量了。

其次,检查有没有其他变量也指向这个“盒子”,如果没有其他变量指向这个“盒子”,再检查盒子所占空间超过255字节长没?超过了,盒子才会被销毁(释放内存)没超过255字节,则不释放内存(销毁盒子)。

要想释放内存,可以用

$a  = null;的方式,这样盒子被销毁了,但是中花名册中还有该变量哦!

 

1     /*引用赋值一改俱改,但是unset不是改盒子里的值,所以unset变量a,变量b没变化*/
2     $a = 200;
3     $b = &$a;
4     unset($a);
5     var_dump($a,$b); //NULL int(100)

 

 

上面的代码,执行到unset($a)时候,就是将变量a的指向断开,同时将变量a扔出花名册,从下图可以看出,对变量b是没有影响的。

 

 

但是,如果用$a = null;这种方式销毁变量时,将会有如下影响:

1 <?php
2     $a = 100;
3     $b = &$a;
4     $a = null;
5     var_dump($a,$b); //NULL NULL
6 ?>

 这种方式,释放了内存,但是共用一个地址的另一个变量也受到了影响。

 

 

 

 

看看这两种方式在数组上的应用:

 1 <?php
 2     $aaa = array(
 3         'a'=>1,
 4         'b'=>2
 5     );
 6     unset($aaa['a']);
 7     print_r($aaa); //Array ( [b] => 2 ) ,用unset,扔出花名册,数组中这一项不存在了
 8     
 9     
10     
11     $bbb = array(
12         'a'=>1,
13         'b'=>2
14     );
15     $bbb['a'] = null;
16     print_r($bbb); //Array ( [a] => [b] => 2 ) ,用 = null,数组中这一项还存在,只是值为空了
17 ?>

 

posted @ 2019-03-22 15:23  html55  阅读(2410)  评论(0编辑  收藏  举报