PHP对象引用

时间:2018-05-29 06:54:49

标签: php object reference

我对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中没有更改引用?

1 个答案:

答案 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参考:

https://www.toptal.com/php/objects-references-php-memory