深入理解PHP变量的值类型和引用类型


Posted in PHP onOctober 21, 2015

在PHP中,大部分变量类型,如字符串,整型,浮点,数组等都是值类型的,而类和对象是引用类型,在使用的时候,需要注意这一点。

看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式。

PHP的变量在内存中是这样存储的,变量保存的并不直接是值的内容,而是地址。例如:

$a = 1;

我们看起来,似乎变量$a直接存储了 1 这个值。而实际情况是,PHP解释器创建了变量$a,将值:1 存入内存中的某个地方,再将值的地址存到变量$a中。

需要取值时,先找到变量$a中的地址,再根据地址找到变量的值。

往下看:

echo $a;

会输出1,PHP解释器会这样完成这一样代码:找到$a中存储的地址,根据地址找到存在内存某个地方的值,输出到屏幕。

看似一行简单的代码,流程却是这样的。

再往下看:

$a = 1;
$b = &$a;

这里的变量$b 做了一个有趣的操作,&符号取出了$a变量中存储的地址,并存储到$b变量。

那么,如果使用下面代码:

echo $b;

结果也将是输出1,PHP解释器先取出$b中存储的地址,再根据地址找到值。如果我们做下面的操作:

$a = 2;
echo $b; //输出2

会发现改变$a的值,$b也跟着变了。其实反过来,改变$b的值,$a的值也会跟这变。

到这一步,我们可以确定,变量$a和$b存储了相同的地址,指向的值是一样的。

那么,我们可以得出结论:它们表示的是同一个变量。

进一步总结,可以得出:如果两个变量存储了相同的地址,它们就是同一个变量。

了解了着一些内容,我们开始介绍值类型和引用类型。

我们先看下面的代码:

$a = 1;
$b = $a;
$a = 2;
echo $b; //输出 1

将$a的值赋给$b,改变$a的值后,$b的值依然不变,也就是说$a和$b是两个不同的变量,指向不同的地址。这种赋值时会创建不同的变量的形式我们称之为值类型。

再看:

class User{
 public $name = ‘Tome‘;
}
$a = new User;
$b = $a;
$a->name = ‘Jim‘;
echo $b->name; //输出 Jim

同样将$a的值赋给$b,改变$a后,$b也跟着变了,也就是说$a和$b是同一个变量,指向相同的地址。这种赋值时不会创建新的变量的形式我们称之为引用类型。

PHP 相关文章推荐
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
thinkphp缓存技术详解
Dec 09 PHP
WebQQ最新登陆协议的用法
Dec 22 PHP
DEDECMS首页调用图片集里的多张图片
Jun 05 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
php cli配置文件问题分析
Oct 15 PHP
yii,CI,yaf框架+smarty模板使用方法
Dec 29 PHP
Symfony生成二维码的方法
Feb 04 PHP
WordPress中的shortcode短代码功能使用详解
May 17 PHP
ZendFramework框架实现连接两个或多个数据库的方法
Dec 08 PHP
PHP钩子实现方法解析
May 21 PHP
php ZipArchive实现多文件打包下载实例
Oct 31 PHP
为你总结一些php系统类函数
Oct 21 #PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
Oct 21 #PHP
使用xampp搭建运行php虚拟主机的详细步骤
Oct 21 #PHP
php获取汉字拼音首字母的方法
Oct 21 #PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
Oct 21 #PHP
PHP中的switch语句的用法实例详解
Oct 21 #PHP
PHP 实现的将图片转换为TXT
Oct 21 #PHP
You might like
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
PHP实现RTX发送消息提醒的实例代码
2017/01/03 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
ztree获取当前选中节点子节点id集合的方法
2015/02/12 Javascript
Node.js事件驱动
2015/06/18 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
jQuery根据ID、CLASS、等获取对象的实例
2016/12/04 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
nodejs基础知识
2017/02/03 NodeJs
基于vue实现swipe分页组件实例
2017/05/25 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
2017/09/05 Javascript
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
python编写Logistic逻辑回归
2020/12/30 Python
Pytorch中的自动求梯度机制和Variable类实例
2020/02/29 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
华三通信H3C面试题
2015/05/15 面试题
《明天,我们毕业》教学反思
2014/04/24 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
2014年优秀党员材料
2014/12/18 职场文书
老龙头导游词
2015/02/11 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书