深入理解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
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
Apr 26 PHP
php5.2以下版本无json_decode函数的解决方法
May 25 PHP
PHP小技巧之函数重载
Jun 02 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
php实现zip文件解压操作
Nov 03 PHP
PHP中SSO Cookie登录分析和实现
Nov 06 PHP
基于PHP实现数据分页显示功能
May 26 PHP
PHP生成图像验证码的方法小结(2种方法)
Jul 18 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
PHP预定义接口――Iterator用法示例
Jun 05 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 09 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
一个更简单的无限级分类菜单代码
2007/01/16 PHP
php 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
php下统计用户在线时间的一种尝试
2010/08/26 PHP
php中将指针移动到数据集初始位置的实现代码[mysql_data_seek]
2012/11/01 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
php实现简单爬虫的开发
2016/03/28 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
PHP7引入的"??"和"?:"的区别讲解
2019/04/08 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
2017/05/22 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
vue 设置 input 为不可以编辑的实现方法
2019/09/19 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
Python实现针对含中文字符串的截取功能示例
2017/09/22 Python
python机器学习之神经网络(三)
2017/12/20 Python
Python实现替换文件中指定内容的方法
2018/03/19 Python
python实现五子棋小游戏
2020/03/25 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
2020/02/27 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
python 3.8.3 安装配置图文教程
2020/05/21 Python
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
区优秀教师事迹材料
2014/02/10 职场文书
市场营销求职信范文
2014/02/21 职场文书
敬老模范事迹
2014/05/21 职场文书
作文批改评语
2014/12/25 职场文书
实验心得体会范文
2016/01/25 职场文书
话题作文之成长
2019/12/09 职场文书
使用MybatisPlus打印sql语句
2022/04/22 SQL Server