php - PHP 对象引用
问题描述
我对 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
?
解决方案
$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
将列表的第一个节点更改为,因为您在执行 while 循环时NULL
更新了变量。$node
然后,当 while 循环结束时,此行将您的 $note 变量引用更新为 NULL。
阅读有关对象参考的更多信息:
推荐阅读
- docker - Docker-compose 正在使用 1001:1001 USER:GROUP 安装卷
- arrays - Javascript Array问题ParseInt string inside Array
- python - Python中的百分位数计算
- botframework - Botframework V4 上的网络聊天价值交换问题
- python - 写入 CSV:“UnicodeDecodeError:‘charmap’编解码器无法解码字节 0x9d”
- bouncycastle - 使用 Bouncy Castle 从不包含证书的 PFX 文件中提取私钥
- python - 使用 defaultdict 对 pandas 中的值进行 bin 处理
- python - 在我的情况下,“str”类型对象的未知格式代码“f”是什么意思?
- jquery - Wordpress 网站 jeguery 移动响应式切换菜单不起作用
- javascript - 点击JS后汉堡菜单不消失