2016-03-29 12 views
0

私はC++/Python/JavaからPHPを初めて使用しています。 PHPには、組み込みの配列型があります。新しいオブジェクトを挿入した後、同じ配列であることを証明するにはどうしたらいいですか? C++/Python/Javaでは、オブジェクトのアドレス、id()、またはハッシュコードを使用してオブジェクトが同じかどうかをテストできます。PHPで同じテストを行うにはどうすればよいですか?アレイのアドレスはどのように取得できますか?

<?php 
    $a['0'] = "a"; 
    $a['1'] = 'b'; //here, $a is a new copied one or just a reference to the old? 
?> 

[OK]をクリックします。実際には特に問題はありません。新しい値を挿入する前と後で配列オブジェクトが同じであるかどうかを知りたいだけです。 Pythonでは 、私はこのようなテストを行うことができます

a = [1] 

print id(a) 
a.append(2) 
print id(a) 

ところで、これはPythonでのid()関数のマニュアルです。

id(...) 
    id(object) -> integer 

    Return the identity of an object. This is guaranteed to be unique among 
    simultaneously existing objects. (Hint: it's the object's memory address.) 

更新コード:

# -*- coding: utf-8 -*- 

a = [1, 2, 3] 
b = [1, 2, 3] 

print id(a) 
print id(b) //the id(b) is not same as id(a), so a and b has same content, but they both own their own values in the memory 

c = a // c is a reference to a 
c.append(4) 
print c 
print a //after appending a new value(which means insert a new value to array), a has same value as c 

ので、問題は、私は同じことを行うことができれば、私は私が確認する、両方のC++/Pythonの/ Javaでコードがメモリレイアウトを証明することができますですPHP。

+1

あなたはどのような問題を解決する必要がありますか?あなたのコードはあまりヒントを与えていません... C++が要素を追加すると、全く新しい配列が作成されるのは変です。 –

+2

私はC++/python/Javaについて何も知らないけど、phpでは新しい要素を追加すると配列は同じです。 – Epodax

+1

PHPにはそのような仕組みがありません。 PHPで適切な方法を提案するために解決しようとしている問題を説明しなければなりません。 – deceze

答えて

4

はい、配列は、その内容を変更したときと同じ「オブジェクト」(PHPがそれを呼び出すのではなく、概念的に)のままです。コピー(「ソフトコピー」、コピーオンライトコピーは)それだけではなくて機能にあなた

  • 参照を使用せずに別の変数に配列を割り当てる(=&
  • パスを作られています本当にすべて同じである(

参照することなく、機能から

  • returnにそれを参照しますオブジェクト:別の変数に割り当てる)

  • +0

    具体的には、コード例で明らかにしたいと思いますか? – deceze

    +0

    OPのコンテキストでは、ステートメントをexample code.Meansでバインドすることができます。 –

    +0

    私はあなたが下のzval構造をダンプする低レベルのデバッガ関数を使うことができると思いますが、実際のuserland APIはありません。ステートメント)。 – deceze

    3

    @Anantが投稿したものに加えて、PHP Reference Countingには、変数がPHPのランタイムエンジンによってどのように格納されるかが記載されています。

    偶数の配列メンバーは、他のオブジェクト、配列、変数がポイント(参照)できる参照であることがわかります。つまり、CまたはPythonではメモリ内の2つの異なる場所に存在する2つの「同一の」配列で、PHPは個別の値を指す参照で別々に格納します。

    これらの値のうちの1つが2つの非参照変数によってポイントされている場合、変更された値の新しい参照を作成し、各変数が異なる参照を指すようになります。これはCopy On Writeの最適化です。

    この投稿はStackExchangeプログラミングからも得られます。最初の答えはより良いリンクを提供します:Why are array references rarely used

    5

    デフォルトでは、オブジェクトは参照のみによって割り当てられます。他のすべてのもの(配列を含む)は値によって割り当てられます。同じ配列を指す2つの変数を持つ唯一の方法は、&演算子を使って明示的に参照を設定することです。 References Explainedの章では、このテーマについての概要を説明しています。あなたも簡単なvar_dump()と、かなり簡単に参照を見つけることができ、オブジェクトの場合は

    $a = new DateTime; 
    $b = $a; 
    $c = clone $a; 
    var_dump($a, $b, $c); 
    
    object(DateTime)#1 (3) { 
        ["date"]=> 
        string(26) "2016-03-29 10:18:28.000000" 
        ["timezone_type"]=> 
        int(3) 
        ["timezone"]=> 
        string(13) "Europe/Madrid" 
    } 
    object(DateTime)#1 (3) { 
        ["date"]=> 
        string(26) "2016-03-29 10:18:28.000000" 
        ["timezone_type"]=> 
        int(3) 
        ["timezone"]=> 
        string(13) "Europe/Madrid" 
    } 
    object(DateTime)#2 (3) { 
        ["date"]=> 
        string(26) "2016-03-29 10:18:28.000000" 
        ["timezone_type"]=> 
        int(3) 
        ["timezone"]=> 
        string(13) "Europe/Madrid" 
    } 
    

    $a$bで共有#1識別子を注意してください。

    他のタイプでは、まったく些細なことではありません。前述の章のSpotting Referencesセクションには、かなり古いものの、チェックしたいかもしれない複雑なコードのuser commentがあります。

    関連する問題