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 中字符串、整型、浮点、数组等这些都是值类型,而类和对象是引用类型。

原文地址:https://www.cnblogs.com/leeyongbard/p/9822805.html

时间: 2024-09-30 05:18:01

PHP变量的值类型和引用类型的相关文章

浅谈PHP变量的值类型和引用类型

看到网友在讨论PHP的&符号,要彻底理解它的用法,就有必要讨论一下变量的两种形式. PHP的变量在内存中是这样存储的,变量保存的并不直接是值的内容,而是地址.例如: $a = 1; 我们看起来,似乎变量$a直接存储了 1 这个值.而实际情况是,PHP解释器创建了变量$a,将值:1 存入内存中的某个地方,再将值的地址存到变量$a中. 需要取值时,先找到变量$a中的地址,再根据地址找到变量的值. 往下看: echo $a; 会输出1,PHP解释器会这样完成这一样代码:找到$a中存储的地址,根据地址找

现金与存折---值类型和引用类型

在软考的时候也接触过值类型和引用类型,那时候应付做题还是可以的,可是考完之后再突然面对这两个词汇,又觉得迷茫无措了.现在想想,还是实践吧,当时只是简单的了解了其原理,没有用代码来实现,所以只能算是初步的,暂时的了解.这篇文章就是为了弥补初步的遗憾,进行深一步的学习. 理论联系实践,才是对现实的超越.就像门和钥匙一样,完美结合才有防窃和安全之功效.所以,该篇文章的主要思路也是从理论和实践两个方面分别对"值类型和引用类型"进行详细阐述. --------------------------

值类型和引用类型, c++, c#

C中没有值类型和引用类型这种无稽之谈, 只有变量的概念. 一个变量就代表一块命名的存储区域. C++中确实有引用的概念和语法, 不过底层基本上都是指针实现. C#为什么把变量分为值类型和引用类型... 实际上, C#的引用类型底层不过是指针实现, 不过因为编译器/解释器为你管理了指针而已. 而C/C++中指针是直接暴露给编程人员的语法接口, 所以C/C++中根本没有什么值类型和引用类型的说法, 因为所有的C/C++程序员都知道他们写下的变量会被放在内存的哪个位置.

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

程序运行时,它的数据必须存储在内存中,数据项需要多大的内存.存储在什么地方以及如何存储都依赖该数据项的类型 运行中的程序使用两个区域来存储数据:栈和堆 栈是一个内存数组,是一个LIFO(last in first out后进先出)的数据结构 栈存储几种类型的数据: 某些类型变量的值 程序当前执行环境 传递给方法的参数 栈有以下几大特征 数据只能从栈的顶端插入和删除 把数据放到栈顶端称为入栈push 从栈顶删除数据称为出栈pop 堆是一块内存区域,在队里可以分配大块的内存用于存储某类型的数据. 与

定义类+类实例化+属性+构造函数+匿名类型var+堆与栈+GC回收机制+值类型与引用类型

为了让编程更加清晰,把程序中的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是孤立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会. 面向对象编程也叫做OOP编程 简单来说面向对象编程就是结构化编程,对程序中的变量结构划分,让编程更清晰. 类的概念: 类实际上是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法. 类定义了类的每个对象(称为实例)可以包含什么数据和功能. 类中的数据和函数称为类的成员:数据成员        函数成员 数据成员: 数据成员

Java值类型和引用类型

[定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字符型4,逻辑型 八种: 1,整型3种 by

java 值类型和引用类型的区别

1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变.值类型表示复制一个当前变量传给方法, 当你在这个方法中改变这个变量的值时,最初生命的变量的值不会变.通俗说法: 值类型就是现金,要用直接用:引用类型是存折,要用还得先去银行取现.----(摘自网上) [值类型] 也就是基本数据类型 基本数据类型常被称为四类八种 四类: 1,整型 2,浮点型 3,字

值类型,引用类型

值类型 (value type) 一种由类型的实际值表示的数据类型.如果向一个变量分配值类型,则该变量将被赋以全新的值副本.(这与引用类型不同,在引用类型中,赋值时不创建副本.)值类型通常创建在方法的栈帧上,而不是在垃圾回收堆中.可以对值类型进行装箱,这是一个创建相应引用类型的过程. 引用类型 (reference type)  由类型的实际值引用(类似于指针)表示的数据类型.如果为某个变量分配一个引用类型,则该变量将引用(或“指向”)原始值.不创建任何副本.引用类型包括类.接口.委托和装箱值类

c# 值类型与引用类型 值传递与引用传递

值类型与引用类型: 值类型 :1.值类型大小固定.存储在栈上.  2.不能继承,只能实现接口 3.派生自valuetype int double char float byte bool enum struct decimal 引用类型:1.在栈上存储了一个地址实际存储在堆中,大小不固定. 2.数组.类.接口.委托 string 数组 类 接口 委托 值传递与引用传递: 值类型按值传递.值类型按引用传递.引用类型按值传递.引用类型按引用传递. 值传递:默认传递都是值传递 ,把栈中内容拷贝一份引用