深入理解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 smarty模版引擎中的缓存应用
Dec 11 PHP
PHPWind 发帖回帖Api PHP版打包下载
Feb 08 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
May 06 PHP
PHP不用递归遍历目录下所有文件的代码
Jul 04 PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 PHP
PHP实现批量修改文件后缀名的方法
Jul 30 PHP
windows下apache搭建php开发环境
Aug 27 PHP
php session的锁和并发
Jan 22 PHP
thinkphp3.x中session方法的用法分析
May 20 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
php中str_pad()函数用法分析
Mar 28 PHP
Laravel服务容器绑定的几种方法总结
Jun 14 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 程式大小
2006/12/06 PHP
Zend Framework中的简单工厂模式 图文
2012/07/10 PHP
php存储过程调用实例代码
2013/02/03 PHP
基于php冒泡排序算法的深入理解
2013/06/09 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
2014/04/25 PHP
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
JavaScript与HTML的结合方法详解
2015/11/23 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
JS 循环li添加点击事件 (闭包的应用)
2016/12/10 Javascript
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
Python内存管理方式和垃圾回收算法解析
2017/11/11 Python
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
2019/09/25 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
django model object序列化实例
2020/03/13 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
init进程的作用
2012/04/12 面试题
好的促销活动方案
2014/08/21 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
员工辞职信怎么写
2015/02/27 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
Python实现视频中添加音频工具详解
2021/12/06 Python