c# - php中的数据类型分为引用类型和值类型吗?像 C#

标签 c# php value-type reference-type

在c#中,数据类型分为引用类型和值类型。

那么在php中,数据类型还分c#吗?

我发现了一个有趣的事情。

数组是大多数语言中的引用类型。

例如,在 C# 中:

    int[] a ={1,4,5};
    int[] b = a;
    a[1] = 10;
    print(a);
    print(b)

a和b都是[1,10,5]

但在 php 中,假设有以下代码:

<?php
$a=array(1,4,5);
$b=$a;
$a[1]=10;
print_r($a);
print_r($b);
?> 

最后$a是(1,10,5),$b是(1,4,5)。看来php中的数组是值类型。

谁能回答我的问题: php中的数据类型分为引用类型和值类型吗?

最佳答案

是的,本质上对象被声明为引用类型,而其他一切都是值类型。但是,前者并不完全正确,最好将其描述为“指针类型”。

举个例子:

$a = new stdClass(); # <-- Obj1
$a->foo = 'foo';
$b = $a;
$b->foo = 'bar';
echo $b->foo; # outputs 'bar'
echo $a->foo; # outputs 'bar'

如您所见,$a 似乎是通过引用传递的;但是,它实际上是正在传递的那个对象的标识符 的副本。因此,更新属性 将影响原始值,但更新变量的 则不会。这与真实的 PHP 引用对比如下:

$c =& $a;
$c = new stdClass(); # <-- Obj2
$c->foo = 'foo';
echo $b->foo; # outputs 'bar'
echo $a->foo; # outputs 'foo'

这里我们创建了 $a as/in $c 的“真实引用”。这认为对 $a 的任何更改都会导致 $c 被更改,反之亦然。因此,当我们更新 $c 的 value 时,$a 也会更新并指向 Obj2;同时 $b 不受值改变的影响,仍然指向 Obj1

关于c# - php中的数据类型分为引用类型和值类型吗?像 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18395302/

相关文章:

php - Laravel 中的单元测试 : Error when setting the Currently Authenticated User

php - Wordpress 要求提供 FTP 凭据以进行升级

java - 在 java 中的堆栈内存上创建对象?

c# - 底层连接已关闭 : An unexpected error occurred on a send

php - 如何在SQL中根据字符相似度比较字符串?

c# - 如何停止动画WPF?

C# - 如何确保我的所有结构都已初始化?

syntax - 如何在 CIL : `.class value` or just `.class` ? 中声明值类型

c# - 跟踪对自动实现的属性的调用

c# - 无法将网格从先前值动画化为新值