3

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 のデータ型は参照型と値型に分類されますか?

4

1 に答える 1

3

はい、本質的にオブジェクトは参照型であると述べられていますが、それ以外はすべて値型です。ただし、前者は完全に正しいわけではなく、「ポインター型」と表現する方が適切かもしれません。

例を挙げると:

$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'

ここでは、$c として $a の「真の参照」を作成します。これは、$a を変更すると $c が変更されることになり、その逆も同様です。そのため、$c のを更新すると、$a も更新されてObj2を指します。その間、 $b は値が変更されても影響を受けず、引き続きObj1を指します。

于 2013-08-23T06:32:10.983 に答える