【发布时间】:2023-04-04 04:40:02
【问题描述】:
我对 PHP 如何处理对象和引用感到困惑。我知道在分配给变量或传递给函数时,对象是通过引用分配或传递的。但是,以下示例令人困惑:
$node = new Node("a", 1);
$a = new Node("b", 2);
$b = new Node("c", 3);
$c = new Node("d", 4);
$d = new Node("e", 5);
$d->setPrevious($c);
$d->setNext(null);
$c->setNext($d);
$c->setPrevious($b);
$b->setNext($c);
$b->setPrevious($a);
$a->setNext($b);
$a->setPrevious($node);
$node->setNext($a);
$node->setPrevious(null);
echo countNode($node);
echo "\n";
remove($node->getNext());
echo countNode($node);
echo "\n";
function countNode(Node $node) {
$i = 0;
while (null !== $node) {
$i++;
$node = $node->getNext();
}
return $i;
}
function remove(Node $node) {
$next = $node->getNext();
$previous = $node->getPrevious();
$previous->setNext($next);
$next->setPrevious($previous);
}
其中输出如下:
5
4
我知道我不需要从“删除”方法中返回节点对象,因为该对象是通过引用传递的。但是“countNode”方法是什么? $node 变量必须是 null,不是吗?
更新
由于这个问题似乎有点模棱两可,我想问的更准确一点:remove 方法改变了$node 的引用。从双向链表中删除一个节点后,大小从 5 减少到 4。
但是countNode 也在重新分配$node 变量,因此必须返回0?!为什么countNode中的引用没有变化?
【问题讨论】:
-
您删除了“b”节点,而不是“a”节点。但即使从双向链表中删除一个节点也不会使创建该节点的变量无效。
-
@Dormilich 我想指出的是,
$node变量的大小由remove函数更改,而不是由countNode方法更改。因为countNode遍历双向链表,所以第二个回显必须显示 0?!