深入理解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 stream_context_create()作用和用法分析
Mar 29 PHP
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
Oct 31 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
php中文字符串截取方法实例总结
Sep 30 PHP
PHP中4种常用的抓取网络数据方法
Jun 04 PHP
PHP读取汉字的点阵数据
Jun 22 PHP
PHP实现的memcache环形队列类实例
Jul 28 PHP
smarty中常用方法实例总结
Aug 07 PHP
Zend Framework教程之配置文件application.ini解析
Mar 10 PHP
PHP实现获取并生成数据库字典的方法
May 04 PHP
浅谈PHP错误类型及屏蔽方法
May 27 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
用libtemplate实现静态网页生成
2006/10/09 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
Laravel框架之解决前端显示图片问题
2019/10/24 PHP
如何运行/调试你的PHP代码
2020/10/23 PHP
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
跟我学习javascript的prototype,getPrototypeOf和__proto__
2015/11/17 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
2018/07/06 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
jQuery实现当拉动滚动条到底部加载数据的方法分析
2019/01/24 jQuery
Vue渲染过程浅析
2019/03/14 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
vue搜索页开发实例代码详解(热门搜索,历史搜索,淘宝接口演示)
2020/04/11 Javascript
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
python中threading超线程用法实例分析
2015/05/16 Python
Python + selenium自动化环境搭建的完整步骤
2018/05/19 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Python实现图片识别加翻译功能
2019/12/26 Python
深入浅析python变量加逗号,的含义
2020/02/22 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
CSS3 边框效果
2019/11/04 HTML / CSS
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
女性时尚在线:IVRose
2019/02/23 全球购物
20年同学聚会感言
2014/02/03 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
Python经常使用的一些内置函数
2022/04/11 Python