深入理解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 相关文章推荐
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
献给php初学者(入门学习经验谈)
Oct 12 PHP
php cookies中删除的一般赋值方法
May 07 PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 PHP
hadoop常见错误以及处理方法详解
Jun 19 PHP
php strnatcmp()函数的用法总结
Nov 27 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
php实现当前页面点击下载文件的简单方法
Sep 22 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
Oct 15 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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+MySQL修改记录的方法
2015/01/21 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
php结合ACCESS的跨库查询功能
2015/06/12 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
javascript网页关键字高亮代码
2008/07/30 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
在js(jquery)中获得文本框焦点和失去焦点的方法
2012/12/04 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
js隐式全局变量造成的bug示例代码
2014/04/22 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
easyui中combotree循环获取父节点至根节点并输出路径实现方法
2016/11/10 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
详解在Python的Django框架中创建模板库的方法
2015/07/20 Python
python批量提取word内信息
2015/08/09 Python
python中返回矩阵的行列方法
2018/04/04 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
将 Ubuntu 16 和 18 上的 python 升级到最新 python3.8 的方法教程
2020/03/11 Python
详解Python中第三方库Faker
2020/09/25 Python
IBatis持久层技术
2016/07/18 面试题
关于读书的演讲稿500字
2014/08/27 职场文书
2014个人反腐倡廉思想汇报
2014/09/15 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
Windows11里微软已经将驱动程序安装位置A盘删除
2021/11/21 数码科技