php的变量引用与销毁机制
在php中,符号"&"表示引用。
1、看看不引用的情况是这样子:
$a = "hello world";//定义一个变量,下面赋值给$b
$b = $a;//这一步没有在$a之前加符号&,像这样子"$b= & $a"。没有加&,实际上原理是会将变量$a复制拷贝一份,也就是内存中重新申请一个地址存储变量$b了
ps:在php中,使用"="直接赋值,其实就是拷贝一份右边的变量给b,会生成一份内存空间,结果可能是同样的内容在内存中两份。在有些关于php性能方面提到,这样子会多占有内存空间。不过我接触中,大部分人没怎么注意,其实一般应用这样子用产生的显著差异并不明显。不会看到什么效果,其实我本人也没经常使用&进行引用,呵呵。只是我觉得,深入了解里面的实现原理,非常有必要。我喜欢关注原理性的东西。
2、使用符号&进行引用
$a = "hello world";
$b = & $a;
使用引用,php引擎不会拷贝一份变量,其实就是将指针指向了$a在内存中的地址,$b中就是保存了这个指针。
所以使用引用的时候,把$b的值改变,$a也会跟着改变
比如:
$a = "hello world";
$b = & $a;
$b = "test new value";//把b的值改掉,a的值也会跟着改变
echo $a;//输出test new value,因为改变了b的值也会改变a的值。
=====================================
经常在定义函数的时候看到像这样的情况:
function test (& $param)
{
//函数定义的内容
$param++;
}
解释:$param前面带有引用,所以传入进来的参数并不会在内存中拷贝一份,而是直接对原来的内存空间进行引用。所以:如果里对使用符号&传入进来的变量值进行修改了,那么也会改变原来的内存空间中的值。
做个测验如下:
$k = 8;
test($k);
echo $k;//结果$k的值被函数里面改变了,输出9。
还会经常看到这样子调用函数:
$return = & test_func();
前面了解到php引擎的机制是:=会把右边的内容拷贝一份给予左边的变量。所以使用&就是将函数的结果不会进行拷贝一份,实际上我的理解是把指针给了左边的变量。
什么是指针,以前学c语言中的概念。我的理解是就是:指针,指针,指向针(指南针,呵呵)。把指针看成是一个内存的地址容易理解点,计算机就知道去内存什么位置找数据了吧。这是浅显的理解,深入的我不会,呵呵。
总结:使用引用是为了减少内存资源的占用。
php手册中对引用的解释如下:
在 PHP 中引用意味着用不同的名字访问同一个变量内容。这并不像 C 的指针,替代的是,引用是符号表别名。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身——变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的 hardlink。
3、销毁变量的时候。并不会改变原来的值。
试验:$b = & $a;
既然改变$b的值,$a的值也跟着改变,假如把$b销毁掉(内存中不占用空间了,不是null,也不是值为""),$a的值是不是也会跟着被删掉呢?
其实国外有本php方面的书中专门提到了这个机制。2年前看的。不是很记得了。原则是就是删除变量的时候,会自动拷贝。
其实这样子,就是为了避免把$b给删掉,造成把$a也给删掉的问题。
<?php
//只有等到销毁的时候就会自动拷贝一份。php不会把被引用的变量销毁掉。
$a = 'd';
$b = & $a;
$b = 8;//因为是引用了,所以把b的值改掉,a的值也跟着改为8了。
var_dump($b,$a);
unset($b);//调用unset删除b变量,a变量不会删除
var_dump($b,$a);//输出
调用unset删除$b变量的时候,php引擎从变量符号表中发现:我要删除的变量$b原来是引用了变量$a,这不好删除啊,因为一删除导致$a变量也没了,所以就先把$a变量拷贝一份后在删除$b变量。
关于php符号表:其实我的理解是,运行中所有变量名称都记录在里面,php来维护,具体的数据当然是存储在内存中,php就是根据这个符号表去回收没有用到的变量空间的,释放内存空间)。去看看php的垃圾回收机制(释放不再使用的内存空间),就是根据符号表进行的。
php的变量引用与销毁机制的更多相关文章
- 引用计数gc机制使用不当导致内存泄漏
上一篇文章找同事review了一下,收到的反馈是铺垫太长了,我尽量直入正题,哈哈 最近dbd压测时发现内存泄漏,其实这个问题去年已经暴露了,参见这篇博客[压测周].当时排查不够仔细,在此检讨下.关于d ...
- JavaScript--我发现,原来你是这样的JS(四)(看看变量,作用域,垃圾回收机制是啥)
一.介绍 这是红宝书(JavaScript高级程序设计 3版)的读书笔记第四篇,是红宝书第四章内容(主要是变量和作用域问题),当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的 ...
- JS--我发现,原来你是这样的JS(四)(看看变量,作用域,垃圾回收机制是啥)
一.介绍 这是红宝书(JavaScript高级程序设计 3版)的读书笔记第四篇,是红宝书第四章内容(主要是变量和作用域问题),当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的 ...
- php中引用&的真正理解-变量引用、函数引用、对象引用
php的引用(就是在变量或者函数.对象等前面加上&符号) //最重要就是 删除引用的变量 ,只是引用的变量访问不了,但是内容并没有销毁 在PHP 中引用的意思是:不同的名字访问同一个变量内容. ...
- php引用计数与变量引用
每个php5.5变量都存储在一个叫做zval的变量容器中. 一个zval变量容器,除了包含变量的类型与值外,还包含两个字节的额外信息: 1.第一个是“is_ref”,是个bool型,用来标识这个变量是 ...
- php & 变量引用、函数引用、对象引用
变量的引用 PHP 的引用允许你用两个变量来指向同一个内容 <?php $a="ABC"; $b =&$a; echo $a;//这里输出:ABC ec ...
- php引用(&)变量引用,函数引用,对象引用和参数引用用法
php引用(&)变量引用,函数引用,对象引用和参数引用用法 php的引用(就是在变量或者函数.对象等前面加上&符号) 在PHP 中引用的意思是:不同的名字访问同一个变量内容.与C语 ...
- C++ 指针 引用 变量引用
变量引用: 引用的作用就是给变量起个别名,假如有一个变量a,想给它起个别名b, 可以这么写:int a;//定义a是整型变量.int &b=a;//声明b是a的引用. 上面就是 ...
- 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针
1.引用内部函数绑定机制 #include<iostream> #include<functional> usingnamespacestd; usingnamespac ...
随机推荐
- SmartUpload类实现上传和下载
实现文件的上传与下载,可以使用Java的I/O流的类来实现,也可以使用专业的上传.下载组件.这些组件提供了现成的类,程序员只需调用这些类中的方法即可实现文件的上传与下载.本章将向读者介绍如何应用jsp ...
- Oracle 12C -- purge dba_recyclebin
SQL> create user abce identified by abce; User created. SQL> grant resource,connect to abce; G ...
- RecyclerView的滚动事件OnScrollListener研究
(1)滚动事件分类 列表的滚动一般分为两种: 1.手指按下 -> 手指拖拽列表移动 -> 手指停止拖拽 -> 抬起手指 2.手指按下 -> 手指快速拖拽后抬起手指 -> ...
- photoshop,钢笔工具锚点类型
以下是钢笔工具绘制出的三种类型的锚点,分别是:无切线的硬锚点.左右切线平行的锚点.左右切线不平行的锚点. 使用转换点工具点击锚点,可以实现 无切线锚点 和 左右切线平行的锚点 之间的转化: 对 左右切 ...
- MySql(十三):MySql架构设计——可扩展性设计之 MySQL Replication
一.前言 MySQL Replication能够将一个 MySQL Server 的 Instance 中的数据完整的复制到另外一个 MySQL Server 的 Instance 中.虽然复制过程并 ...
- mybatis一对一和一对多实例
一对一:<association></association> 一对多:<collection></collection> ClassMapper.xm ...
- Ubuntu java install & config
im:http://jingyan.baidu.com/article/08b6a591cb06f114a8092209.html http://www.cnblogs.com/zknublx/p/5 ...
- android:clipChildren 属性
这个属性默认为true: 两个用法: 1.设置为false ,使用ViewPager 的时候能够 实现一屏上显示多个Item 2.动画能越界
- js 动画3 完美框架
js 框架: function getStyle(obj,attr){ if(obj.currentStyle){ return obj.currentStyle[attr]; } else{ ret ...
- sql左右连接测试
with a as (select 1 as id, 'name1'as nameunionselect 2 as id, 'name2'as nameunionselect 3 as id, 'na ...