Неочевидные проблемы использования объектов.

AP

Новичок
а не проще наследованием это сделать??????????????? и никаких вам циклических ссылок!
 

Gorynych

Посетитель PHP-Клуба
AP

что именно? Или, по другому: Вы что предлагаете, делать вертикаль наследования, постепенно расширяющую свойства/методы от минимального абстрактного, до всеобъемлющего класс? Типа - возникла новая задача, пишем новый класс, наследуем его от предыдущего последнего и вперед?

черт, а зачем тогда вообще нам дерево классов? Может ну их: берем и пишем процедурный код - все под рукой.

объектный подход это не только наследование, но еще и инкапсуляция
 

Alkinoy

Начинающий
просто вот это
PHP:
unset($this->simple2);
надо ставить в деструктор класса, раз уж ты в переменной объекта делаешь ссылку на другой объект....
 

bkonst

.. хочется странного?...
Alkinoy
Вы ведь попробовали сделать это перед тем, как высказывать свое мнение?
 

atv

Новичок
Мне вот интересно, а как же обстоит дело с DOMDocument и SimpleXML, изобилующих перекрёстными ссылками?
 

bkonst

.. хочется странного?...
В SimpleXML, кстати, нет ссылок на родительский узел (по крайней мере, в документированном интерфейсе).

Аналогично и DOMDocument: узлы дерева не содержат ссылок на сам документ, так что его деструктор будет вызван вовремя.
 

atv

Новичок
Аналогично и DOMDocument: узлы дерева не содержат ссылок на сам документ
Ну как же, вот http://www.php.net/manual/en/ref.dom.php.
Свойства DOMNode:
Код:
parentNode	DOMNode	yes	The parent of this node.
childNodes	DOMNodeList	yes	A DOMNodeList that contains all children of this node. If there are no children, this is an empty DOMNodeList.
firstChild	DOMNode	yes	The first child of this node. If there is no such node, this returns NULL.
lastChild	DOMNode	yes	The last child of this node. If there is no such node, this returns NULL.
previousSibling	DOMNode	yes	The node immediately preceding this node. If there is no such node, this returns NULL.
nextSibling	DOMNode	yes	The node immediately following this node. If there is no such node, this returns NULL.
attributes	DOMNamedNodeMap	yes	A DOMNamedNodeMap containing the attributes of this node (if it is a DOMElement) or NULL otherwise.
ownerDocument	DOMDocument	yes	The DOMDocument object associated with this node.
Всё это перекрёстные ссылки, между предыдущим и следующим узлом, между родителем и потомками, между аттрибутами и владельцем, и между документом.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Не вижу я в коде
PHP:
  $node = new TreeNode();
  $node->addChild(new TreeNode());
взаимные ссылки - и всё тут. Покажите.

Может, $node->addChild(new TreeNode($node)); ?

Все-равно не вижу проблемы... Срок исполнения скрипта - меньше секунды, если дольше - надо смотреть задачу предметно.
Много памяти объекты не кушают, память кушают массивы данных - их и надо удалять при надобности.
Если у вас объект используется для хранения данных вместо массива ... ниче, и не такое бывает :)
А отсутствие gc в PHP во время исполнения - так это не проблема, а фича. Примите или не юзайте PHP.

-~{}~ 22.03.07 19:25:

Автор оригинала: atv
>третий объект, хранящий часть связей.
Код в студию...
например, декоратор
 

bkonst

.. хочется странного?...
atv
Да, про ownerDocument забыл...


grigori
Не вижу я в коде
взаимные ссылки - и всё тут. Покажите.
...И тут мы лезем в реализацию addChild и видим там что-нибудь наподобие:
PHP:
function addChild($node) {
  $node->setParent($this);
  $this->childNodes[] = $node;
  ...
}
Но это всё равно несущественно.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
bkonst, это не форум телепатов или гадалок!
 

bkonst

.. хочется странного?...
grigori
Лавры Фаната покоя не дают, придирчивый вы наш? Там за 1 пост до кода говорилось о "дереве со ссылками на узел-родитель". Таки трудно было сложить 2 и 2 ?
 

atv

Новичок
Все-равно не вижу проблемы... Срок исполнения скрипта - меньше секунды
А причём здесь время? Если скрипт скушает всю память то время тебя не спасёт. Некоторые провайдеры не разрешают ставить IPB, так как он сжирает всю память.

Примите или не юзайте PHP.
Разве вопрос так ставился? Топик был на заметку программистам, так как проблема неочевидная и в офф. документации о ней не упоминается. Конечно из-за этого юзать PHP не перестанем, но будем юзать его акуратнее, с умом.

например, декоратор
И что это даст? Вместо Simple1<->Simple2 получим Simple1->Decorator->Simple2->Simple1, всё теже циклические ссылки.
 

AP

Новичок
Автор оригинала: atv
Если скрипт скушает всю память то время тебя не спасёт. Некоторые провайдеры не разрешают ставить IPB, так как он сжирает всю память.
и что же это за провайдеры?
 

jonjonson

Охренеть
atv, а смысл Simple1->Decorator->Simple2->Simple1 или вы не поняли смысл декоратора?
Пусть есть класс Simple1. Simple2 является для него декоратором. По этому Simple1 не нужно ссылаться на Simple2. Тоже можно решить наследованием.

Так же выше приводился пример с окружением и сеансом. А почему сеанс не может стать потомком окружения или декоратором. При этом сеанс может иметь два варианта с сессией и без неё.

Главное определиться что вам нужно от другого объекта, а не тупо сцеплять их как репейники на всякий случай.

Насчёт структур данных я уже ответил
возможно определённые структуры должны иметь определённые методы удаления элементов из себя
Что вы продемонстрировали сами, создав специальный метод.

Я ещё могу привести пример зацикливания ссылок... Это ситуация, когда оба объекта обсерверы и обоих интересует какое-то событие в другом. Но обсервер предполагает кроме атача ещё и детач. Решил прибить один из таких объектов, то убей в деструкторе ссылки на всех наблюдателей.
 

atv

Новичок
jonjonson, кто в лес, кто по дрова. У вас искажённое восприятие сказанного, поэтому ещё раз перечитайте топик, и ещё раз перечитайте назначение паттерна декоратор.
 
Сверху