设为首页 加入收藏

TOP

PHP变量传值赋值和引用赋值,变量销毁
2019-08-23 00:36:04 】 浏览:17
Tags:PHP 变量 引用 销毁
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共同指向一个地址。

 1 <?php
 2     $a = 100;
 3     $b = 200;
 4     
 5     $a = &$b;
 6     var_dump($a,$b); //int(200) int(200)
 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、b
16 ?>

 

 

 

 

<?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 ?>

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Mac配置虚拟主机 下一篇[日常] 正则表达式 小括号() 中括..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目