深入理解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
Nov 25 PHP
PHP 字符串 小常识
Jun 05 PHP
Wordpress php 分页代码
Oct 21 PHP
php运行出现Call to undefined function curl_init()的解决方法
Nov 02 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
PHP 登录完成后如何跳转上一访问页面
Jan 14 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
Jan 26 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
PHP编辑器PhpStrom运行缓慢问题
Feb 21 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
May 02 PHP
PHP CURL与java http使用方法详解
Jan 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
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
用 PHP5 轻松解析 XML
2006/12/04 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
深入理解:XML与对象的序列化与反序列化
2013/06/08 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
2014/10/30 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
AngularJS入门教程之更多模板详解
2016/08/19 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
小试SVG之新手小白入门教程
2019/01/08 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
Python中使用Queue和Condition进行线程同步的方法
2016/01/19 Python
Python自定义简单图轴简单实例
2018/01/08 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
美国在线家居装饰店:Belle&June
2018/10/24 全球购物
小学生打架检讨书
2014/01/26 职场文书
园艺师求职信
2014/04/27 职场文书
政府法律服务方案
2014/06/14 职场文书
小学安全汇报材料
2014/08/14 职场文书
2014年建筑工作总结
2014/11/26 职场文书
python 经纬度求两点距离、三点面积操作
2021/06/03 Python