我对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
我知道我不需要从“remove”方法返回节点对象,因为对象是通过引用传递的。但是关于“countNode”方法呢? $node
变量必须是null
,不是吗?
更新
由于这个问题似乎很模糊,我想更准确地问一下这个问题:remove
方法改变了$node
的引用。从双向链表中删除节点后,大小从5减少到4。
但是countNode
也重新分配$node
变量,因此返回0?为什么countNode
中没有更改引用?
答案 0 :(得分:0)
$node
不为NULL,因为在函数remove
中,您没有将$node
设置为NULL。您应该通过
remote
功能
function remove(Node $node) {
$next = $node->getNext();
$previous = $node->getPrevious();
$previous->setNext($next);
$next->setPrevious($previous);
$node = null;
}
$node
的引用不会在内存中清除,它始终存在于php
应用程序关闭或您将其设置为NULL
<强>更新强>
function countNode(Node $node) {
$i = 0;
while (null !== $node) {
$i++;
$node = $node->getNext(); //This Line
}
return $i;
}
countNode
中的代码将列表的第一个节点更改为NULL
,因为您在执行while循环时更新了$node
变量。然后,当while循环结束时,此行将$ note变量引用更新为NULL。
Readmore about Object参考: