Ссылки на объекты PHP - PullRequest
0 голосов
/ 29 мая 2018

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

1 Ответ

0 голосов
/ 29 мая 2018

$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, потому что вы обновляете переменную $node, когда выполняете цикл while.Затем эта строка обновляет ссылку на переменную $ note на NULL, когда цикл while завершился.

Подробнее об объекте Ссылка:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...