深入理解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出错界面
Oct 09 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
PHP数据库调用类调用实例(详细注释)
Jul 12 PHP
php全排列递归算法代码
Oct 09 PHP
PHP生成等比缩略图类和自定义函数分享
Jun 25 PHP
基于php的微信公众平台开发入门实例
Apr 15 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
yii添删改查实例
Nov 16 PHP
php利用递归实现删除文件目录的方法
Sep 23 PHP
PHP 断点续传实例详解
Nov 11 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
php+Ajax无刷新验证用户名操作实例详解
Mar 04 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
ThinkPHP之R方法实例详解
2014/06/20 PHP
PHP中通过fopen()函数访问远程文件示例
2014/11/18 PHP
php实现多城市切换特效
2015/08/09 PHP
PHP的Laravel框架中使用AdminLTE模板来编写网站后台界面
2016/03/21 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
javascript编程起步(第四课)
2007/02/27 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
2013/12/11 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
Bootstrap 组件之按钮(二)
2016/05/11 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
iview日期控件,双向绑定日期格式的方法
2018/03/15 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
在Python的循环体中使用else语句的方法
2015/03/30 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python学习--使用QQ邮箱发送邮件代码实例
2019/04/16 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python 实现弹球游戏的示例代码
2020/11/17 Python
python 制作网站小说下载器
2021/02/20 Python
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
描述内存分配方式以及它们的区别
2016/10/15 面试题
大学生关于奋斗的演讲稿
2014/01/09 职场文书
2014社区三八妇女节活动总结
2014/03/01 职场文书
聚美优品的广告词
2014/03/14 职场文书
计算机毕业生求职信
2014/06/10 职场文书
科技活动周标语
2014/10/08 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
Java内存模型之happens-before概念详解
2021/06/13 Java/Android