![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| flashaa |
|
||||||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Я написал свой класс, который наследует DOMDocument.
Класс содержит несколько методов, чтобы упростить работу с DOM, сделать синтаксис короче. так же я привел пример одного метода (createNode), чтобы показать суть работы класса. А она такова: при добавлении новых узлов, эти узлы возвращаются, чтобы можно было с ними дальше работать, т.е. составить цепочку вызовов, примерно так:
Методы моего класса возвращают объекты типа DOMElement, а надо сделать, чтобы они возвращали объекты моего класса, который я напишу, наследуя DOMElement
В MyElement я соотвественно напишу метод addAttribs и другие, которые будут дополнять функционал DOMElement, чтобы цепочка вызовов работала. Но вот проблема: когда я пытаюсь вернуть узел из объекта My (строка return $node;) возвращаемый элемент, как я ни пытался, всегда возвращает объект DOMElement, а не мой.
Пробовал делать конструктор MyElement таким:
И возвращать так:
Так при работе createNode действительно возвращает объект MyElement, но почему-то при любой последствующей работе, например
выдает ошибку Warning: DOMElement::setAttribute() [function.DOMElement-setAttribute]: Couldn't fetch MyElement Как реализовать то, что я хочу? Это сообщение отредактировал(а) flashaa - 6.2.2008, 15:23 |
||||||||||||||||
|
|||||||||||||||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Если сказать проще, вопрос будет такой:
Как сделать объект-потомок, имея родительский? Есть object-DOMElement, надо получить object-MyElement при том, что
|
|||
|
||||
| Glip |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 473 Регистрация: 30.12.2006 Репутация: 7 Всего: 18 |
может быть не всё правильно понял, если в My переопределить метод createElement чтобы он возвращал MyElement. или что там .... происходит при
|
||||
|
|||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Glip, + 100! Предложенный вариант отлично работает!
Добавлено через 9 минут и 51 секунду Но теперь у меня другая проблема, член parentNode.. $myElement->parentNode уже существует, т.е. его нельзя создать самому, но его тип опять DOMElement.. |
|||
|
||||
| Glip |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 473 Регистрация: 30.12.2006 Репутация: 7 Всего: 18 |
вероятно надо смотреть и переопределять, если необходимо, appendChild()
а при наличии полного кода, можно наверное найти оптимальное решение |
|||
|
||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 56 Всего: 146 |
flashaa, я вижу тут только один реальный способ. Отказаться от наследования от классов DOM, а написать свои wrapper-ы. Т.е. все классы MyDocument, MyElement и прочие будут повторять методы DOM, просто будут дергать соответствующие методы классов DOM через __call(), а те что нужно доработать или не достаточно логики __call() создать самому. А поля либо заполнять вручную, либо аналогично дергать их через __get(); Пример:
Это сообщение отредактировал(а) sTa1kEr - 6.2.2008, 21:14 |
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Как его можно переопределить, если это встроенный класс. Его код мне недоступен. Да, задача геморрой, поэтому, если будут альтернативные предложения похожей функциональности,то постите здесь. Кстати есть уже готовые инструменты для DOMDocument ? Добавлено через 9 минут и 54 секунды sTa1kEr, спасибо, ваш вариант представляется мне очень неплохим. __call(), __get() очень подходит сюда, завтра опробую в коде. А сейчас большое спасибо! |
|||
|
||||
| flashaa |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
sTa1kEr, я не очень понял, как это мне поможет в том смысле, что нету собственно решения моей проблемы, а именно все завязано на методе, который должен вернуть
Т.е. если возвращаемый объект является объектом DOMNode, то необходимо его преобразовать, получить из него MyNode с помощью nodeFactory - если я правильно понял, хотя не уверен. В таком случае меня как раз и интересовало преобразование из DOMNode в MyNode. Допустим я получаю какую-то ноду DOMNode и условие ( if ($value instanceof DOMNode) ) сработало, то что тогда nodeFactory делает с полученной нодой ? Т.е. поясните вот эту строку:
Это сообщение отредактировал(а) flashaa - 8.2.2008, 10:46 |
||||||
|
|||||||
| sTa1kEr |
|
||||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 56 Всего: 146 |
Вобщем-то не преобразование, а обертка. Весь смысл заключается в заполнении свойства $node... и все. Все что необходимо - это создать экземпляр своего класса и присвоить свойству $node оригинальный объект $domnode. В итоге - это простейший свитч...
И не забыть в конструкторах сделать аргументы не обязательными |
||||
|
|||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
sTa1kEr, да, теперь кажется врубился.
|
|||
|
||||
| flashaa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 796 Регистрация: 7.3.2006 Репутация: 19 Всего: 25 |
Stalker, спасибо! Задача решена
|
|||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |