问题:
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仍然指向原内存地址。
图解:
 
参考:

PHP变量的传值和引用的更多相关文章

  1. 从一次面试经历谈PHP的普通传值与引用传值以及unset

    关于这个概念一般都会在PHP的第一堂课说变量的时候给介绍,并且我以前还给其他PHPer介绍这个概念.但是作为一个工作一段时间的PHPer的我,竟然在面试的时候一下子拿不定主意最后还答错了,很觉得丢脸( ...

  2. Js 赋值传值和引用传址

    赋值传值和引用传址 在JavaScript中基本数据类型都是赋值传值,复合数据类型都是引用传址(传地址) 基本数据类型的变量名和数据是直接存在"快速内存"(栈内存)中,而复合数据类 ...

  3. js学习笔记<拷贝传值,引用传址和匿名函数>

    拷贝传值:把一个变量的值拷贝一份,传给了另外一个变量拷贝传值中,两个变量之间没有任何联系,修改其中一个一个变量的值,原来的变量不变. 例: var arr1 = ["张三",24, ...

  4. php普通传值和引用传值 (相当通俗易懂的一篇讲解)

    首先,要理解变量名存储在内存栈中,它是指向堆中具体内存的地址,通过变量名查找堆中的内存; 普通传值,传值以后,是不同的地址名称,指向不同的内存实体; 引用传值,传引用后,是不同的地址名称,但都指向同一 ...

  5. [javaSE] 变量的传值与传址

    变量:就是将不确定的数据进行存储.也就是需要在内存中开辟一个空间 这个空间需要一个名称,这个名称就是变量名 基本数据类型:byte,short,int,long,double,float,char,b ...

  6. python传值&值引用

    [python传值&值引用] 和其他语言不一样,传递参数的时候,python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方式.实际上,这种方式相当于传值 ...

  7. PHP的普通传值与引用传值以及unset

    首先,要理解变量名存储在内存栈中,它是指向堆中具体内存的地址,通过变量名查找堆中的内存; 普通传值,传值以后,是不同的地址名称,指向不同的内存实体; 引用传值,传引用后,是不同的地址名称,但都指向同一 ...

  8. Python基础一. 简介、变量、对象及引用

    一.Python简介 Python是一门计算机编程语言,它是由荷兰人Guido van Rossum在1989年圣诞节期间为了打发无聊的圣诞节而编写的,作为ABC语言的继承 特性: 面向对象.解释型. ...

  9. 【Java面试题】2 Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?超详细解析

    /* * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 * 答: * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的 ...

随机推荐

  1. 线程局部存储TLS(thread local storage)

    同一全局变量或者静态变量每个线程访问的是同一变量,多个线程同时访存同一全局变量或者静态变量时会导致冲突,尤其是多个线程同时需要修改这一变量时,通过TLS机制,为每一个使用该全局变量的线程都提供一个变量 ...

  2. 删除一个数字之后数列gcd最大

    ★实验任务 顾名思义,互质序列是满足序列元素的 gcd 为 1 的序列.比如[1,2,3], [4,7,8],都是互质序列.[3,6,9]不是互质序列.现在并不要求你找出一个互质 序列,那样太简单了! ...

  3. spring时间管理

    spring时间管理相比Quartz要简单的多,但功能不如quartz强大 spring.xml的配置 <?xml version="1.0" encoding=" ...

  4. datatables 排序 如何禁止

    $.extend( true, $.fn.dataTable.defaults, {     "searching": false,     "ordering" ...

  5. C++ 查看预处理后的源文件(查看真实代码)

    gcc -E filename.cpp 会生成 filename.cpp 的预处理文件,这样就能看到宏展开后的代码,用于理解和调试宏非常有帮助.   http://www.qtdebug.com/cp ...

  6. Java override 和 overload 的区别和联系

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多 ...

  7. Shopping Bands Rank & SBR

    Shopping Bands Rank SBR https://www.guiderank.org/index.html Nike Air Zoom Pegasus 34 http://www.shi ...

  8. nowcoder 202F-平衡二叉树

    题目链接 题目描述 平衡二叉树,顾名思义就是一棵“平衡”的二叉树.在这道题中,“平衡”的定义为,对于树中任意一个节点,都满足左右子树的高度差不超过 d. 空树的高度定义为0,单个节点的高度为1,其他情 ...

  9. hao123劫持主页

    转自:https://www.zhihu.com/question/39881858 第一步 Firefox.打开Firefox,按Alt+H弹出帮助菜单,点“故障排除信息” 第二步 点“配置文件夹” ...

  10. MT【122】一个重要的不平凡的无穷级数

    求证:$1+\dfrac{1}{4}+\dfrac{1}{9}+\cdots +\dfrac{1}{n^2}+\cdots = \dfrac{\pi^2}6$. 解答:考虑$$\dfrac{\sin ...