深入理解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
PHP 飞信好友免费短信API接口开源版
Jul 22 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Jan 27 PHP
php实现用户在线时间统计详解
Oct 08 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
May 13 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
PHP实现的随机IP函数【国内IP段】
Jul 20 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
详解php语言最牛掰的Laravel框架
Nov 20 PHP
基于php双引号中访问数组元素报错的解决方法
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中curl、fsocket、file_get_content三个函数的使用比较
2014/05/09 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
php简单生成随机数的方法
2015/07/30 PHP
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
20款超赞的jQuery插件 Web开发人员必备
2011/02/26 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
总结Javascript中的隐式类型转换
2016/08/24 Javascript
JavaScript类的写法
2016/09/17 Javascript
canvas 实现中国象棋
2017/02/17 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
浅谈Node框架接入ELK实践总结
2019/02/22 Javascript
Vue.js中的extend绑定节点并显示的方法
2019/06/20 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
[02:52]DOTA2新手基础教程 米波
2014/01/21 DOTA
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
施华洛世奇意大利官网:SWAROVSKI意大利
2018/07/23 全球购物
思想政治自我鉴定
2013/10/06 职场文书
办公室文员工作自我评价
2013/12/01 职场文书
简单租房协议书
2014/04/09 职场文书
网络文明传播志愿者活动方案
2014/08/20 职场文书
高中学生自我评价范文
2014/09/23 职场文书
2014年外联部工作总结
2014/11/17 职场文书
离婚协议书范文
2015/01/26 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
Python带你从浅入深探究Tuple(基础篇)
2021/05/15 Python
MySQL 执行数据库更新update操作的时候数据库卡死了
2022/05/02 MySQL