zoukankan      html  css  js  c++  java
  • PHP的普通传值与引用传值以及unset

    首先,要理解变量名存储在内存栈中,它是指向堆中具体内存的地址,通过变量名查找堆中的内存;

    • 普通传值,传值以后,是不同的地址名称,指向不同的内存实体;
    • 引用传值,传引用后,是不同的地址名称,但都指向同一个内存实体;改变其中一个,另外一个就也被改变;

    以下我将通过三个列子来详细讲解这两个传值的区别:

    Example1:

    <?php
    //普通传值
    $param1=1; 
    $param2=2; 
    $param2 = $param1; 
    $param1 = 5; //变量1和变量2是两块内存,互不影响;
    echo $param2; //所以此处还是显示为1
    
    //引用传值 ↓↓
    $param1=1; 
    $param2=2; 
    $param2 = &$param1; //把变量1的内存地址赋给变量2;此时的变量2和变量1全等;
    echo $param2;// 1
    $param1 = 5; //变量1和变量2是一处内存,改变其中一个,另外一个也被改变;
    echo $param2; //显示为5
    ?>

    Example2:

    <?php
    //函数中的普通传值 ↓↓
    $param1 = 1; 
    function add($param2){
      $param2=3; 
    }
    $param3=add($param1); //调用方法add,并将变量1传给变量2,此处是普通传值,所以变量1和变量2是两处内存,互不影响;
    echo '<br>$param1=='.$param1.'<br>'; //显示为$param1==1
    echo '<br>$param2=='.$param2.'<!-- <br> -->'; //显示为$param2== 因为$param2是局部变量,函数运行完了以后就自动销毁,其不能影响全局
    
    //函数中的引用传值 ↓↓ 注意,php不建议这样使用,并且php.in里面设置其会报错;
    $param1 = 1; 
    function add($param2){
      $param2=3; 
      return $param2;
    }
    $param3=add(&$param1); //调用方法add,并将变量1的引用传给变量2,此时两个地址指向同一内存,改变其中一个,另外一个也要被改变;
    echo $param1; //3,内存已在函数内部改变;
    echo $param3; //3 
    ?>

    Example3:

    <?php
    //给数组里面的键值各增加10;
    $arr = array(3,5);
    
    foreach($arr as $k=>$v){
     $v+=10;//1.更改无效,相当于遍历出的键值扔给变量$v,然后更改变量$v的值,跟数组无关;
     echo $v." ";//输出13 15;
    }
    
    foreach($arr as $k=>$v){
      $arr[$k]+=10;//2.更改有效,直接更改键名里面的值;
      echo $v;//输出3,5;
     }  
    
    foreach($arr as &$v){
      $v+=10;//3.更改有效,遍历的键值直接给了$v的地址,这个地址其实就是键名..$v+10就等于$arr[$k]+10;
    } 
    ?>

     然后我们来看一下这道面试题:

    $a = 1;
    $b = &$a;
    unset($a);
    echo $b; //??

     但是要注意: unset并没有真正销毁变量的作用...仅仅是切断了变量与内存之间的关系,内存只要还被引用着就不会被释放; $b和$a同时指向1,切断其中$a的关系,$b还是指向1,所以上题不报错,照样输出1。

    -------------------------------------------------END----------------------------------------------------------------

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    129. Sum Root to Leaf Numbers
    117. Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/wenhainan/p/7234745.html
Copyright © 2011-2022 走看看