深入理解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+DBM的同学录程序(2)
Oct 09 PHP
php下将图片以二进制存入mysql数据库中并显示的实现代码
May 27 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
PHP生成短网址的3种方法代码实例
Jul 08 PHP
php实现excel中rank函数功能的方法
Jan 20 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 PHP
PHP安装memcache扩展的步骤讲解
Feb 14 PHP
ThinkPHP3.2框架自带分页功能实现方法示例
May 13 PHP
yii框架使用分页的方法分析
Jul 25 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生成图形(Libchart)实例
2013/11/06 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
AngularJS 模块详解及简单实例
2016/07/28 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
vue教程之toast弹框全局调用示例详解
2020/08/24 Javascript
vue中使用百度脑图kityminder-core二次开发的实现
2019/09/26 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
python正则表达式匹配[]中间为任意字符的实例
2018/12/25 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
html5手机端页面可以向右滑动导致样式受影响的问题
2018/06/20 HTML / CSS
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
投标单位介绍信
2014/01/09 职场文书
会计顶岗实习心得
2014/01/25 职场文书
电子信息专业自荐书
2014/02/04 职场文书
《争吵》教学反思
2014/02/15 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
大学生撤销处分思想汇报
2014/09/12 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
大学生学期个人总结
2015/02/12 职场文书
护士求职自荐信
2015/03/25 职场文书
《黄道婆》教学反思
2016/02/22 职场文书
LeetCode189轮转数组python示例
2022/08/05 Python
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技