深入理解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 相关文章推荐
拼音码表的生成
Oct 09 PHP
域名查询代码公布
Oct 09 PHP
PHP排序算法的复习和总结
Feb 15 PHP
记录PHP错误日志 display_errors与log_errors的区别
Oct 09 PHP
PHP实现的连贯操作、链式操作实例
Jul 08 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
Oct 21 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
PHP爬虫之百万级别知乎用户数据爬取与分析
Jan 22 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 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 str_pad 函数用法简介
2009/07/11 PHP
洪恩在线成语词典小偷程序php版
2012/04/20 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
JQuery的ON()方法支持的所有事件罗列
2015/02/28 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
2016/03/05 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
python生成日历实例解析
2014/08/21 Python
python进阶教程之文本文件的读取和写入
2014/08/29 Python
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
浅谈python字符串方法的简单使用
2016/07/18 Python
Python贪心算法实例小结
2018/04/22 Python
Python中文编码知识点
2019/02/18 Python
Python安装与基本数据类型教程详解
2019/05/29 Python
python版DDOS攻击脚本
2019/06/12 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
在python3中实现更新界面
2020/02/21 Python
执行Python程序时模块报错问题
2020/03/26 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
Nike意大利官网:Nike.com IT
2020/01/19 全球购物
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
加多宝凉茶广告词
2014/03/18 职场文书
研讨会主持词
2014/04/02 职场文书
就业协议书怎么填
2014/04/11 职场文书
警告通知
2015/04/25 职场文书
优质服务标语口号
2015/12/26 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL