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

  • 相关阅读:
    oracle重新学习,主要是命令实用,有借鉴其他人博客
    cdn缓存立刻刷新
    python3发送需要双向认证的wss请求
    【2021.08.03】平等交流
    【2021.07.31】正面回应才是面对挑战的最好方式
    【2021.07.28】向晚
    【2021.07.25】过个生日
    【2021.07.17】Asoul——那些无法杀死我的,终会使我变得更加强大
    phaser3微信小游戏2
    eve-ng 配置apache2的虚拟目录
  • 原文地址:https://www.cnblogs.com/wenhainan/p/7234745.html
Copyright © 2011-2022 走看看