zoukankan      html  css  js  c++  java
  • PHP变量的传值和引用

    问题:
    1、PHP变量的存储、取值方式如何?
    2、变量赋值时,普通传值和引用传值分别是什么意思?有何区别?
    3、unset被赋值的变量会对两种赋值后原值和新值的影响?
     
    变量的存储、取值形式:
    变量名存储在内存栈中,它是指向堆中具体内存的地址,通过变量名查找堆中的内存。
     
    含义和区别:
    普通传值,传值以后,是不同的地址名称,指向不同的内存实体;
    引用传值,传引用后,是不同的地址名称,但都指向同一个内存实体;改变其中一个,另外一个就也被改变;
    引用传值举例:
    $a = 1;
    $b = &$a;
    dump($b); //int 1
    $a=2;
    dump($b); //int 2

    解析:

    $b=&$a表示:$b找到$a指向的内存实体1,并建立$b与1的指针关系。
    此时,如果$a改变指向,$b就会自动追随$a改变指向。
    注意:变量名的指向是内存地址,不是另一个变量。
     
    unset对两种赋值的影响:
    引用传值后unset被赋值的变量举例:
    $a = 1;
    $b = &$a;
    unset($a);
    dump($a); // null
    dump($b); //int 1

    延伸:

    PHP的内存释放是由计数器决定的,内存管理原则是:
    1, unset只是变量计数器减1,,当计数器为0的时候会触发回收。
    2, $s=null 会直接触发回收。
    解析:
    在传引用的正常情况下,如果$a改变指向,$b就会自动追随$a改变指向。但是如果$a与内存的指针关系被注销,$b不需要做出任何变化,仍然指向原内存地址。
    unset($a)是delete掉$a和内存实体1的指针关系,由于内存实体1还在被另一个变量$b引用着,所以内存实体1不会被回收。所以$a没有了指向的内存地址,值就是null。$b仍然指向原内存地址。
    图解:
     
    参考:
  • 相关阅读:
    Understanding performance, load and stress testing
    添加查看原型的插件
    Navicat Premium 15安装破解
    APP 测试 与 WEB 测试的本质区别
    app专项测试(稳定性测试、安全性测试)
    ubantu在登录界面一致循环的问题
    Ubuntu虚拟机安装
    装WIN7
    Linux线程模型浅析
    django中常用的数据查询方法
  • 原文地址:https://www.cnblogs.com/cquptzzq/p/8492959.html
Copyright © 2011-2022 走看看