PHP变量传值赋值和引用赋值,变量销毁
程序员文章站
2022-04-28 10:52:20
php中,上面的代码,变量是怎么存放的呢? 上面的代码变动下,将变量b赋值给变量a,会发生什么? 问题来了,$a = $b,那么是将变量a的指针指向了变量b指针所指向的位置?还是变量a指向的位置的值变了? 引用赋值和上面传值赋值不同,引用赋值是两个变量指向一个地方,一旦这样,一改俱改。 怎么引用赋值 ......
1 <?php 2 $a = 100; 3 $b = 200; 4 var_dump($a,$b); //int(100) int(200) 5 ?>
php中,上面的代码,变量是怎么存放的呢?
上面的代码变动下,将变量b赋值给变量a,会发生什么?
1 <?php 2 $a = 100; 3 $b = 200; 4 $a = $b;/*多了这个*/ 5 var_dump($a,$b); //int(200) int(200) 6 ?>
问题来了,$a = $b,那么是将变量a的指针指向了变量b指针所指向的位置?还是变量a指向的位置的值变了?
引用赋值和上面传值赋值不同,引用赋值是两个变量指向一个地方,一旦这样,一改俱改。
怎么引用赋值呢?变量名前加&即可,
$a = &$b;
这样赋予变量a的就不仅仅是变量b的值,而是变量b的地址,变量a和变量b共同指向一个地址。
<?php $a = 100; $b = 200; $a = &$b; var_dump($a,$b); //int(200) int(200) /*变量b引用赋值给变量a后,ab指向同一个地址,将会一改俱改,如下:*/ $a =500; var_dump($a,$b);//int(500) int(500) 一改俱改 $b = 700; var_dump($a,$b);//int(700) int(700) 一改俱改 ?>
<?php /*理解下面的话*/ $a = 100; //变量a赋值int 100 ,100是基础数据类型,不是变量,是存在变量指向位置的 $a = $b; //变量b的值 赋值 给变量a,变量a,b各有各的指向,执行之后,各是各的。 $a = &$b; //变量b的值的地址 赋值给变量 a ,变量a,b共用一个地址哦!一改俱改! ?>
销毁变量用unset
1 <?php 2 /* 3 4 5 php中unset()是用来销毁变量的,但很多时候,unset()只把变量给销毁了, 6 内存中存放的该变量的值仍然没有销毁,也就是没能达到我们想要的释放内存的效果。 7 这里可以用 变量=null 的方法来释放其内存 8 9 unset也会释放内存的情况 10 11 1. 在变量值所占空间超过255字节长的时候,unset(变量)才会释放内存 12 2. 只有当指向该值的所有变量都被销毁后,地址才会被释放(比如$a,$b都指向该值,仅仅unset($a);是不释放的,$b还是正常存在的)(也要执行1的判断) 13 14 15 16 */ 17 18 19 20 21 $a = 200; 22 $b = &$a; 23 unset($a); 24 var_dump($a,$b); //null int(100) 25 ?>
上面的代码,执行到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 ?>
下一篇: 利用百度知道做网站推广的方法与注意事项