Я запутался в том, как 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
?