php中的数据类型是否分为引用类型和值类型?喜欢C#

时间:2013-08-23 05:23:27

标签: 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中的数据类型是否分类为引用类型和值类型?

1 个答案:

答案 0 :(得分:3)

是的,essentialy对象被声明为引用类型,而其他所有内容都是值类型。但是,前者并不完全正确,可能更好地描述为“指针类型”。

举个例子:

$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的“真实参考”作为/ in $ c。这意味着对$ a的任何更改都会导致$ c被更改,反之亦然。因此,当我们更新$ c的时,$ a也会更新并指向 Obj2 ;同时$ b不受被改变的值的影响,仍然指向 Obj1