0

このリンクされたリストの次の出力について混乱しています

class ListNode{
    public $next = NULL;
    public $data = NULL;
    public function __construct($data){
        $this->data = $data;
    }

}

class LinkedList{
    private $firstNode = NULL;
    private $lastNode = NULL;


    public function insertFirst($data){
        $link = new ListNode($data);
        $link->next = $this->firstNode;
        $this->firstNode = &$link;
        if($this->lastNode == NULL){
            $this->lastNode = &$link;
        }

    }

    public function readList(){
        while($this->firstNode != NULL){
            echo $this->firstNode->data;
            $this->firstNode = $this->firstNode->next;
        }
    }

    public function assessList(){
        $copy = $this->firstNode;
        echo $copy->data;
        echo $this->firstNode->data;
        $copy->data = 'm';
        echo $copy->data;
        echo $this->firstNode->data;        
    }

}

$linkedList = new LinkedList();
$linkedList->insertFirst('c');
$linkedList->insertFirst('b');
$linkedList->insertFirst('a');
//$linkedList->readList();  //output a b c
$linkedList->assessList();  //outputs a a m m

出力は になると思いますa a m a$copyに格納されている値の単なるコピーだと思いました$this->firstNode

このコード行は$copy = $this->firstNode値による代入ではありませんか? a a m m参照による割り当ての場合は出力が期待されます$copy = &$this->firstNodeが、値による割り当ての場合はそうではありません。

誰かが明確にしてもらえますか?

EDIT(追加の例)

public function assessList(){
    $copy = $this->firstNode->data;
    echo $copy. "<br/>";
    echo $this->firstNode->data. "<br/>";
    $copy = 'm';
    echo $copy. "<br/>";
    echo $this->firstNode->data. "<br/>";       
}
4

1 に答える 1

3

これ:

$copy = $this->firstNode;

オブジェクトのコピーではなく、元のオブジェクトへの「ポインタ」のコピーであるため、オブジェクトを変更するときに、基になるオブジェクトを変更します。clone真のコピーを取得するには、キーワードを使用する必要があります。

$copy = clone $this->firstNode;

PHPドキュメントから(私の強調):

すでに作成されているクラスのインスタンスを新しい変数に割り当てると、新しい変数は、割り当てられたオブジェクトと同じインスタンスにアクセスします。

この例から、コードスニペットが次のように出力することがわかります。

aama
于 2013-01-18T16:58:36.620 に答える