【问题标题】:PHP object referencesPHP 对象引用
【发布时间】: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?!

标签: php object reference


【解决方案1】:

$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。

阅读有关对象参考的更多信息:

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

【讨论】:

  • 我想指出的是$node 变量的大小是由remove 函数改变的,而不是由countNode 方法改变的。因为countNode 遍历双向链表,所以第二个回显必须显示 0?!不是吗?
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 2011-02-09
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多