8

まず、ばかげた質問で申し訳ありませんが、php.netの記事を読んでいて、それが何を言っているのか正確に理解できませんでした。

<?php
class SimpleClass
{
    // property declaration
    public $var = 'a default value';

    // method declaration
    public function displayVar() {
        echo $this->var;
    }
}
?>



<?php

$instance = new SimpleClass();

$assigned   =  $instance;
$reference  =& $instance;

$instance->var = '$assigned will have this value';

$instance = null; // $instance and $reference become null

var_dump($instance);
var_dump($reference);
var_dump($assigned);
?>

そしてこれはこれを出力します:

NULL
NULL
object(SimpleClass)#1 (1) {
   ["var"]=>
     string(30) "$assigned will have this value"
}

$instanceと$referenceは同じ場所を指しています。これを取得し、それらに対してNULLとNULLを取得する理由を理解しています。

しかし、$assignedはどうですか?$ instanceが保存されている場所も指しているのですか?使用する$instance->varと$assignedに影響するのに、$ instanceをnullに設定すると、$assignedに変更がないのはなぜですか。

3つの変数すべてがメモリ内の1つの場所を指していると思いましたが、明らかに私は間違っています。正確に何が起こり、$assignedとは何であるかを説明していただけますか?どうもありがとうございます!

4

7 に答える 7

7

$referenceの値を指し$instance、それ自体がオブジェクトへの参照です。したがって、 に含まれる値を変更すると、この変更が$instance$reference反映されます。

$assigned一方、 はの値のコピー$instanceであり、参照先のオブジェクト自体を独立して$instance指します。そのため、値$instanceが何も指さない (つまりnull) に更新されても、$assignedは影響を受けません。これは、まだオブジェクトを指しており、 の内容を気にしないためです$instance

于 2012-10-19T08:10:08.757 に答える
4

ポイントのある場所のデータを更新していないため、設定$instance = null;は更新されません。代わりに、ポインター自体を変更して、ポインターがと同じデータを指さないようにします。$assigned$instance$instance$assigned

于 2012-10-19T08:08:15.947 に答える
2

次の行で、新しいオブジェクトとそのオブジェクトへのポインタを格納するメモリ位置を予約します。ラベルは次の$instanceとおりです。

$instance = new SimpleClass();

次の行で、次のラベルが付いたポインタ への参照を作成します。$instance$reference

$reference =& $instance;

$assigned次の行で、上記とは異なり、独立したというラベルの付いた新しいメモリ位置を予約します。ここには、上記で作成したポインタ(オブジェクト自体ではない)のコピーを格納します。

$assigned = $instance;

に設定$instanceすると、オブジェクト自体ではなく、実際のオブジェクトを含むメモリ位置へのポインタnullのみが設定解除されます。それに対する他の参照(たとえば)も同様に設定解除されます。$reference

$assignedポインタの独立したコピー(別のメモリ位置に保持されている)であり、実際のオブジェクトを指します。

これが、実際のオブジェクトを参照するために引き続き使用できる理由です。

PHPのドキュメントにあるこのコメントは、上記の内容をサポートしています。

<?php
class A {
    public $foo = 1;
}  

$a = new A;
$b = $a;
$a->foo = 2;
$a = NULL;
echo $b->foo."\n"; // 2

$c = new A;
$d = &$c;
$c->foo = 2;
$c = NULL;
echo $d->foo."\n"; // Notice:  Trying to get property of non-object...
?>

ノート

これは、メモリ管理について話すときの一種の例外を表しています。変数または配列のコピーは、=演算子を使用するだけで対処されますが、オブジェクトcloneでは、PHPのドキュメントに記載されているように、キーワードを明示的に使用する必要があります。

PHP内の値による通常の割り当ての例外は、PHP 5で参照によって割り当てられるオブジェクトで発生します。オブジェクトは、cloneキーワードを介して明示的にコピーできます。

于 2012-10-19T08:18:32.377 に答える
2

オブジェクトは、1 つ以上の参照を持つことができるメモリ内の個別のエンティティです。0 になった場合は、ガベージ コレクションされます。

オブジェクトを含む変数は、実際にはそのオブジェクトを指します (参照します)。したがって、これを行うと:

$var1 = new Object();
$var2 = $var1;

同じオブジェクトを指す 2 つの変数を作成するだけです ($var2 は $var1 の値をコピーしますが、その値はオブジェクトへの参照です)。

次に , と書くと$var1 = null、その 1 つの参照が削除されますが、$var2 は引き続きオブジェクトを指しています。

& 演算子は実際にはその背後にある変数への参照を返すので、

$var1 = &var2;

この場合、$var1 は $var2 が指しているオブジェクトも指していませんが、$var1 は $var2 自体を指しています。したがって、$var2 を null にすると、$var1 は同じ null を指します。

于 2012-10-19T08:11:32.097 に答える
1

簡単な答え、を使用して参照を作成すると、次のようになります&

$A  ===+
       |===> [symbol table entry x] ====> (memory location)
$B  ===+

その後、通常の割り当てを行うと、次のようになります。

$A  ===+
       |===> [symbol table entry x] ===> (memory location)
$B  ===+                                    ^
                                            |
$C  =======> [symbol table entry y] ========+

コードをステップ実行しましょう。

$instance = new SimpleClass();

$assigned   =  $instance;

アサーション:

$assigned === $instance

と の両方が の同じインスタンスを参照してい$assignedます。$instanceSimpleClass

$reference  =& $instance;

アサーション:

$assigned === $instance === $reference

すべての変数は同じインスタンスを参照します。

$instance->var = '$assigned will have this value';

アサーション:

$assigned === $instance === $reference

のプロパティ$instanceが変更されても、参照には影響しません。

$instance = null; // $instance and $reference become null

は記号テーブルの単なるエイリアスであるため、 ;$referenceと同じ値を取得します。$instance元のインスタンス (つまり、メモリの場所) の参照カウントは、$assigned変数である 1 に減少します。

于 2012-10-19T08:42:11.797 に答える
0

それは本当に簡単です:

$a = 3;
$b = $a;
$c = &$a;
$a = 0;

var_dump($a);
var_dump($b);
var_dump($c);

出力は次のようになります。

int(0)
int(3)
int(0)

したがって、オブジェクトの割り当てだけでなく、通常の割り当ても同様です。

于 2012-10-19T08:48:34.443 に答える
0

コードでわかるように

$インスタンス = null; // $instance と $reference が null になる

$instance は null に等しくなりましたが、その前に $assigned が設定されていました。したがって、$assigned は null 値を取得しませんでした。=& で参照したため、$reference は null 値を受け取り、$instance の値を保持します。

于 2012-10-19T08:10:28.393 に答える