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变量的值类型和引用类型的更多相关文章

  1. C#基础|值类型和引用类型以及传参问题

    为了明白什么是值类型和引用类型,先引入你两个概念.堆内存与栈内存   堆内存与栈内存   由于咱的描述能力有限,就不对其下定义了,来看看两者的作用.   共同点: 都是用来存放数据的   不同点: 堆 ...

  2. c#学习基础(2)存储、值类型和引用类型、变量

    程序运行时,它的数据必须存储在内存中,数据项需要多大的内存.存储在什么地方以及如何存储都依赖该数据项的类型 运行中的程序使用两个区域来存储数据:栈和堆 栈是一个内存数组,是一个LIFO(last in ...

  3. C# - 值类型、引用类型&走出误区,容易错误的说法

    1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...

  4. 【译】.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱

    为何要翻译 一来是为了感受国外优秀技术社区知名博主的高质量文章,二来是为了复习对.NET技术的基础拾遗达到温故知新的效果,最后也是为了锻炼一下自己的英文读写能力.因为是首次翻译英文文章(哎,原谅我这个 ...

  5. 图解C#的值类型,引用类型,栈,堆,ref,out

    C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...

  6. c# 我所理解的 值类型 and 引用类型

    一直以来对于值类型和引用类型都只是一个模糊的概念,趁最近有空深入理解了下. 先说说值类型,在msdn上是这样介绍值类型的. 意思就是值类型直接包含值. 变量引用的位置就是值所在内存中实际存储的位置,所 ...

  7. JAVA初学(1):值类型和引用类型的区别

    JAVA值类型和引用类型的区别(转)                                                          [定义] 引用类型表示你操作的数据是同一个,也就 ...

  8. C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

    1.C#类和接口的区别接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!而类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类,类里面有抽 ...

  9. .NET面试题解析(01)-值类型与引用类型

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还 ...

随机推荐

  1. Class__One HomeWork 实验报告

    石家庄铁道大学信息科学与技术学院       实验报告 2018年----2019年  第一学期               题目:   四则运算和验证码 课程名称:  JAVA语言程序设计 班    ...

  2. Mysql相关技术细节整理

    一.错误日志相关 1.mysql错误日志所在位置 windows下,错误日志文件一般在安装目录下的data目录下.扩展名是.err的文件,也可以打开安装目录下的my.ini文件检查一下linux下,错 ...

  3. vue:vue-resource

    vue-resource是一个非常轻量的用于处理HTTP请求的插件,它提供了两种方式来处理HTTP请求: 使用Vue.http或this.$http: 使用Vue.resource或this.$res ...

  4. [转载]oracle函数listagg的使用说明

    工作中经常遇到很多需求是这样的,根据条件汇总某些字段,比如我遇到的是,我们公司有三个投资平台,同一个客户拿手机号在三个平台都注册了,但注册过的用户名不一样,显示的时候需要根据手机号显示所有注册过的名称 ...

  5. Autel MaxiSys Elite Diagnostic Tool Common problem solving methods

    1. updating MaxiFlash Elite to firmware 3.21? My maxisys communicate with the MaxiFlash J2534 but Ma ...

  6. Autel Maxisys MS908CV Description

    The new Autel MaxiSys CV Heavy Duty Diagnostic is built on the powerful MaxiSys 908 platform and pro ...

  7. Solr导入MySQL数据之dataimport-handler

    Solr不借助手动JSolr编程情况下也可以将Mysql的数据导入到Solr中.实现方式是安装dataimport-Handler从关系数据库将数据导入到索引库. 1.向SolrCore中加入jar包 ...

  8. Linux 流量监控工具 iftop

    Linux 流量监控工具 iftop Iftop工具主要用来显示本机网络流量情况及各相互通信的流量集合,如单独同哪台机器间的流量大小,非常适合于代理服务器和iptables服务器使用,这样可以方便的查 ...

  9. Eureka-zookeeper的服务发现替代方案

    参考: https://my.oschina.net/thinwonton/blog/1622905 http://www.open-open.com/lib/view/open14269407225 ...

  10. 为什么不应该使用ZooKeeper做服务发现

    [编者的话]本文作者通过ZooKeeper与Eureka作为Service发现服务(注:WebServices体系中的UDDI就是个发现服务)的优劣对比,分享了Knewton在云计算平台部署服务的经验 ...