深入理解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 相关文章推荐
让你同时上传 1000 个文件 (二)
Oct 09 PHP
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
PHP OPCode缓存 APC详细介绍
Oct 12 PHP
PHP将两个关联数组合并函数提高函数效率
Mar 18 PHP
使用php转义输出HTML到JavaScript
Mar 27 PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 PHP
php rmdir使用递归函数删除非空目录实例详解
Oct 20 PHP
谈谈php对接芝麻信用踩的坑
Dec 01 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
详解关于php的xdebug配置(编辑器vscode)
Jan 29 PHP
Laravel框架控制器的middleware中间件用法分析
Sep 30 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
大师制作的中短波矿石收音机
2020/04/02 无线电
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
2014/12/19 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
Vue-router路由判断页面未登录跳转到登录页面的实例
2017/10/26 Javascript
详解html-webpack-plugin插件(用法总结)
2018/09/12 Javascript
详解基于electron制作一个node压缩图片的桌面应用
2019/01/29 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
理解Python中函数的参数
2015/04/27 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
numpy.transpose对三维数组的转置方法
2018/04/17 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
python实现狄克斯特拉算法
2019/01/17 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
函授药学自我鉴定
2014/02/07 职场文书
暑期社会实践感言
2014/02/25 职场文书
服装店营销方案
2014/03/10 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
超市活动计划书
2014/04/24 职场文书
Python基础详解之邮件处理
2021/04/28 Python
Java死锁的排查
2022/05/11 Java/Android