深入理解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中通过ADO调用Asscess数据库和COM程序
Oct 09 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
php异常处理使用示例
Feb 25 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
Codeigniter校验ip地址的方法
Mar 21 PHP
php限制ip地址范围的方法
Mar 31 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
May 23 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 04 PHP
PHP预定义接口――Iterator用法示例
Jun 05 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调用三种数据库的方法(3)
2006/10/09 PHP
PHP写MySQL数据 实现代码
2009/06/15 PHP
解析PHP计算页面执行时间的实现代码
2013/06/18 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
php缓冲输出实例分析
2015/01/05 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
javascript 写类方式之四
2009/07/05 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
AngularJS实现星星等级评分功能
2016/09/24 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
Python中实现常量(Const)功能
2015/01/28 Python
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
在windows下Python打印彩色字体的方法
2018/05/15 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
解释一下ruby中的特殊方法与特殊类
2013/02/26 面试题
总经理岗位职责
2013/11/09 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
成绩单公证书
2014/04/10 职场文书
科学育儿宣传标语
2014/10/08 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书
幽默导游词开场白
2015/05/29 职场文书
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python