深入理解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 相关文章推荐
附件名前加网站名
Mar 23 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 PHP
php $_SERVER windows系统与linux系统下的区别说明
Feb 14 PHP
smarty中英文多编码字符截取乱码问题解决方法
Oct 28 PHP
php中heredoc与nowdoc介绍
Dec 25 PHP
smarty模板引擎从配置文件中获取数据的方法
Jan 22 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 PHP
php unlink()函数使用教程
Jul 12 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
详解php协程知识点
2018/09/21 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
python的id()函数介绍
2013/02/10 Python
python中去空格函数的用法
2014/08/21 Python
python操作ie登陆土豆网的方法
2015/05/09 Python
Python操作MongoDB详解及实例
2017/05/18 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
2018/03/23 Python
python判断设备是否联网的方法
2018/06/29 Python
11个Python3字典内置方法大全与示例汇总
2019/05/13 Python
python调用自定义函数的实例操作
2019/06/26 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
html5的自定义data-*属性与jquery的data()方法的使用
2014/07/02 HTML / CSS
链表面试题-一个链表的结点结构
2015/05/04 面试题
库房管理员岗位职责
2014/03/09 职场文书
原材料检验岗位职责
2014/03/15 职场文书
一分钟演讲稿
2014/04/30 职场文书