PHP变量的值类型和引用类型
PHP 变量在内存中保存的并不直接是值的内容而是值的地址。比如:
$a = 1;
从表面上看起来似乎是 $a 直接存储了 1 这个值。但是实际情况是,PHP 解释器创建了变量 $a ,
将值 1 存入内存中的某个地方,再将值的地址存到变量中。
需要取值时,先找到变量中 $a 的地址,再根据地址找到变量的值。
比如:
echo $a;
当我们执行上面这个语句时,会输出 1 ,但是 PHP 解释器会完成这样一段代码:找到 $a 中存储
的地址(即:先取 $a 的地址),根据地址找到存在内存中某个地方的值,最后输出屏幕上。
用代码表示一下这个过程:
$a = 1;
$b = &$a;
我们看到上面出现了一个 & 符号,这个符号是取地址符,可以取出变量 $a 中存的地址,并存储到变量
$b 中,再使用输出语句:
echo $b;
结果也是输出 1 ,PHP 解释器先取出 $b 中存的地址,再根据地址找到值。下面我们再做一个演示:
$a = 1;
$b = &$a;
$a = 2;
echo $b;
会发现改变 $a 的值,$b 的值也跟着改变了。其实改变 $b 的值,$a 的值也会随着改变。
到这一步,我们能确定的是在 $a 和 $b 中存储了相同的地址,所以,他们指向的值也是一样的。
结论1:如果两个变量存储了相同的地址,它们就是同一个变量。
下面我们来看一下 值类型 和 引用类型。
先看一段代码:
$a = 1;
$b = $a;
$a = 2;
echo $b; // 输出 1
将 $a 赋值给 $b,改变 $a 的值,$b 的值不变,根据上面我们得到的结论,$a 和 $b 是两个不同的变量,
指向不同的地址。
结论2:赋值时会创建不同的变量的形式称之为值类型。
再看一段代码:
class User {
public $name = "Tome";
} $a = new User();
$b = $a;
$a->name = "Joe"; echo $b->name;// 输出 Joe
在这里我们同样把 $a 的值赋值给 $b,改变 $a 后,$b 的值也跟着发生了变化,根据结论1我们知道 $a 和 $b
是同一个变量,指向相同的地址。
结论3:赋值时不会创建新的变量的形式称之为引用类型。
在 PHP 中字符串、整型、浮点、数组等这些都是值类型,而类和对象是引用类型。
PHP变量的值类型和引用类型的更多相关文章
- C#基础|值类型和引用类型以及传参问题
为了明白什么是值类型和引用类型,先引入你两个概念.堆内存与栈内存 堆内存与栈内存 由于咱的描述能力有限,就不对其下定义了,来看看两者的作用. 共同点: 都是用来存放数据的 不同点: 堆 ...
- c#学习基础(2)存储、值类型和引用类型、变量
程序运行时,它的数据必须存储在内存中,数据项需要多大的内存.存储在什么地方以及如何存储都依赖该数据项的类型 运行中的程序使用两个区域来存储数据:栈和堆 栈是一个内存数组,是一个LIFO(last in ...
- C# - 值类型、引用类型&走出误区,容易错误的说法
1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...
- 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱
为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...
- 图解C#的值类型,引用类型,栈,堆,ref,out
C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...
- c# 我所理解的 值类型 and 引用类型
一直以来对于值类型和引用类型都只是一个模糊的概念,趁最近有空深入理解了下. 先说说值类型,在msdn上是这样介绍值类型的. 意思就是值类型直接包含值. 变量引用的位置就是值所在内存中实际存储的位置,所 ...
- JAVA初学(1):值类型和引用类型的区别
JAVA值类型和引用类型的区别(转) [定义] 引用类型表示你操作的数据是同一个,也就 ...
- C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...
- .NET面试题解析(01)-值类型与引用类型
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...
随机推荐
- 【转】Kylin系列-使用Saiku+Kylin构建多维分析OLAP平台
关于Kylin的介绍和使用请参考之前的文章 <分布式大数据多维分析(OLAP)引擎Apache Kylin安装配置及使用示例> Kylin对外提供的是SQL查询接口,基于Kylin构建OL ...
- 微信小程序制作家庭记账本之一
制作的第一天,思索着制作手机端APP还是微信小程序,首先是想到制作APP但是各种收费让我不得不换一条路,所以开始制作小程序,下载了微信小程序开发工具,试着学习制作方法,但是似乎没有成效,但我坚信要一步 ...
- onclick 常用手册
1.如何去使用onclick来跳转到我们指定的页面/跳转到指定url ☆如果只是在本页显示的话,可以直接用location, 方法如下: ①onclick="javascript:windo ...
- how to backup your system of Autel MS908 Pro
how to backup your system of Autel Scan Tool Autel MS908 Pro: Connect the tablet to a PC desktop or ...
- Hbase 过滤器的使用
Filter filter= new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator("."+d ...
- nmap扫描验证多种漏洞
nmap在Kali Linux中是默认安装的.它不仅可以用来确定目标网络上计算机的存活状态,而且可以扫描各个计算机的操作系统.开放端口.服务,还有可能获得用户的证书. 命令结构: nmap -sS - ...
- 计算概论(A)/基础编程练习(数据成分)/1:短信计费
#include<stdio.h> int main() { // 输入当月发送短信的总次数n和每次短信的字数words int n,words; scanf("%d" ...
- bzoj 3083
bzoj 3083 树链剖分,换根 对于一颗树有以下操作 1.确定x为根,2.将u到v的简单路径上的数全改成c,3.询问当前以x为根的子树中的节点最小权值. 如果没有操作1:树链剖分很明显. 于是考虑 ...
- com.sun.jersey.api.client.UniformInterfaceException:returned a response status of 403
这是在同一台电脑上,然后启动两台tomcat进行文件传输时候,会出现的一个异常. 403,是因为tomcat默认禁止上传,在tomcat中的config中的web.xml中进行以下的配置就可以进行文件 ...
- A-作业01
#1 简单作业 1. 系统的日志文件/var/log/secure /var/log/messages /var/log/cron会自动的进行轮询,系统是通过什么实现的? 2. 写出下面特殊符号在定时 ...