深入理解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 相关文章推荐
Discuz! Passport 通行证整合
Mar 27 PHP
php生成的html meta和link标记在body标签里 顶部有个空行
May 18 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Jun 29 PHP
php单态设计模式(单例模式)实例
Nov 18 PHP
php去除二维数组的重复项方法
Nov 03 PHP
thinkphp3.2点击刷新生成验证码
Feb 16 PHP
CI框架AR数据库操作常用函数总结
Nov 21 PHP
PHP实现验证码校验功能
Nov 16 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
PHP等比例压缩图片的实例代码
Jul 26 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
TP5框架使用QueryList采集框架爬小说操作示例
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高级OOP技术演示
2009/08/27 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
php实现excel中rank函数功能的方法
2015/01/20 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
传智播客学习之JavaScript基础篇
2009/11/13 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
javascript刷新父页面的各种方法汇总
2014/09/03 Javascript
JavaScript中5种调用函数的方法
2015/03/12 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
详解SPA中前端路由基本原理与实现方式
2018/09/12 Javascript
手挽手带你学React之React-router4.x的使用
2019/02/14 Javascript
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
python读取Android permission文件
2013/11/01 Python
Python实现ssh批量登录并执行命令
2016/10/25 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
Python日志syslog使用原理详解
2020/02/18 Python
5行Python代码实现图像分割的步骤详解
2020/05/25 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
财务助理岗位职责
2013/11/10 职场文书
2014年社区庆元旦活动方案
2014/03/08 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
管理失职检讨书范文
2015/05/05 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
严以律己专题学习研讨会发言材料
2015/11/09 职场文书
2019年怎样才能撰写出优秀的自荐信
2019/03/25 职场文书
nginx安装以及配置的详细过程记录
2021/09/15 Servers
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA