1

異なるクラス間で重い変数を渡すためのこのコードがあります。目的は、変数が値ではなく参照によって渡されるように、メモリ内に値の重複があってはならないことです。

このサンプルはここにあります。1つの方法を除いて正常に動作します。値がメモリ内で重複していないことを確認するために、値を変更するか、値を削除して確認します。

次に、変数のUNSETを解除すると効果が異なり、NULLにすると効果が異なることがわかりました。

元の変数の設定を解除しても、参照されている変数から値を取得します。元の変数をNULLにすると、何も返されません。

コードは次のとおりです。

<?php

class a {
    private $req;

    public function store_request(&$value) {
        $this->req  = &$value;
    }

    public function get_request() {
        return $this->req;
    }
}


class b {
    private $json;
    private $obj;

    public function init_req(&$request) {
        $this->obj  = new a;
        $this->obj->store_request($request);
    }

    public function get_req() {
        return $this->obj->get_request();
    }
}

$locvar     = 'i am here';

$b  = new b;
$b->init_req($locvar);

$locvar     = 'now here';

##  This will not result empty echo from 'echo $b->get_req();'
//unset($locvar);


##  This will result in empty echo from 'echo $b->get_req();'
//$locvar   = null;

echo $b->get_req();







?>

UNSET行とNULL行はコメント化されています。コードを一度に1行ずつ実行しようとしている場合(これはここではばかげたアドバイスですが、それでも:))

誰かがここで内部で何が起こっているのか教えてもらえますか?

4

1 に答える 1

3
  1. unset値への参照を設定すると、その値への参照が削除され、値自体とそれを指す他の参照は変更されません。
  2. 参照に何かを割り当てると、その参照が指している値が上書きされ、それによって、その参照を指している他のすべての参照の値が上書きされます。
  3. PHPでメモリを細かく管理する必要はありません。PHPは、値を渡すときにメモリ内の値をコピーしません。どうしても必要な場合にのみ新しいメモリを割り当てるコピーオンライト戦略を使用します。PHPでの参照は、特定の動作を生成するための論理演算であり、メモリ管理ツールやCポインターではありません。
于 2012-05-18T08:01:14.843 に答える