深入理解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学习教程之第2天
Jun 15 PHP
php判断字符以及字符串的包含方法属性
Aug 30 PHP
PHP 各种排序算法实现代码
Aug 20 PHP
浅析is_writable的php实现
Jun 18 PHP
解析在zend Farmework下如何创立一个FORM表单
Jun 28 PHP
php发送与接收流文件的方法
Feb 11 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
laravel框架学习笔记之组件化开发实现方法
Feb 01 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
PHP版微信第三方实现一键登录及获取用户信息的方法
2016/10/14 PHP
[原创]提供复制本站内容时出现,该文章转自脚本之家等字样的js代码
2007/03/27 Javascript
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
2016/02/16 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
python非递归全排列实现方法
2017/04/10 Python
python实现简易内存监控
2018/06/21 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
python复合条件下的字典排序
2020/12/18 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
教师节联欢会主持词
2015/07/04 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
Java基础-封装和继承
2021/07/02 Java/Android
Python实现批量自动整理文件
2022/03/16 Python