![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Сабж заключается в чем. Через __get( $name ) делаем перегрузку, обрабатывая обращение к несуществующим свойствам объекта.
Препдоложим, есть вызов: $a = $this->LNG['index']. Свойства LNG в объекте нет. В __get имеем только $name == "LNG". Вопрос заключается в том, как можно получить имя индекса, тобишь "index". |
|||
|
||||
jzZ |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 17.7.2006 Репутация: 1 Всего: 2 |
Возможно я ошибаюсь, но тут идет обращение к переменной внутри класса, она реализует лишь описание объекта. метод __get() вызывается при попытке прочитать значение неопределенного свойства. Кажется правильно будет вызывать несуществующие свойства так: obj->LNG = "blabla"; т.е. уже после определения самого объекта, а внутри не знаю, хотя может быть LNG это уже переменная к-рой было передано св-во из объекта из другого класса? Ну это лишь мои (возможно неправильные рассуждения), попробуйте конкретней описать ситуацию. А если речь идет о инициализации неизвестного св-ва по ключу в массиве т.е. так:
то тут надо воспользоваться интерфейсом ArrayAccess, который поставляется с SPL. Добавлено @ 17:48 точное описание ArrayAccess и его методов |
||||
|
|||||
Mal Hack |
|
||||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Ну как не обращение к несуществующему свойству? LNG через var не описывался.
Это уже __set будет. |
||||
|
|||||
jzZ |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 17.7.2006 Репутация: 1 Всего: 2 |
Это ж только пример, если хотите только __get(), тогда так: $a = obj->LNG; Я просто хотел показать, что если метод __get() реализован в том же классе, в котором вы обращаетесь к несуществующей переменной LNG, не должен работать. По принципу должен работать, если вы обращаетесь к несуществуещему св-ву уже самого объекта т.е. так $obj->LNG. Добавлено @ 18:09
Придется обращаться так $obj[index]; за пределами класса реализующего метод __get() К сожалению сейчас нет возможности проверить свои слова за php, о пределах действия __get() Это сообщение отредактировал(а) jzZ - 6.8.2006, 18:09 |
||||
|
|||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Ты ошибаешься. __get работает так, как я описал выше. Это 100% проверенно.
Я через this обращаюсь, и такой синтаксис будет 100% ошибочным. |
|||
|
||||
jzZ |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 17.7.2006 Репутация: 1 Всего: 2 |
Невнимательность... Чтобы обращаться как я сказал
|
||||
|
|||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
МНе надо все стандартными средствами сделать без лишних телодвижений.
Система переносима должна быть. |
|||
|
||||
jzZ |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 17.7.2006 Репутация: 1 Всего: 2 |
Я не ошибаюсь, только что все сам проверил, просто мы не поняли друг друга. Ты говорил о том что и я только другими словами. Не понимаю чего ты хочешь, сложно сказать без какого-либо кода.
отсюда: http://ru.php.net/manual/en/language.oop5.overloading.php Добавлено @ 19:45 Это если ты имя хочешь получить, а если работать с объектом как с массивом, то только с помощью SPL. |
||||||
|
|||||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Вот по твоему примеру. В $nm я получаю LNG. При вызове
$a = $this->LNG['index'] Массива X у меня нет. Мне надо вернуть: К примеру $b->LNG['index'] так вот имя индекса я НЕ МОГУ ПОЛУЧИТЬ. |
|||
|
||||
imm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 27.7.2005 Репутация: нет Всего: 1 |
|
|||
|
||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
НИчего не понял. Конструктор полуает один параметр, но ты его ниоткуда не передаешь..
ЗЫ: Решить задачу надо через __get или встроенные уже в модель ООП методами. |
|||
|
||||
jzZ |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 91 Регистрация: 17.7.2006 Репутация: 1 Всего: 2 |
Mal Hack
SPL поставляется вместе php5 он и является стандартным ООП решением, не нужно изобретать колесо, читай ссылку что я дал. imm привел наглядный пример его реализации.
это ты получишь работая с ArrayAccess, не иначе как. |
|||
|
||||
imm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 27.7.2005 Репутация: нет Всего: 1 |
В принцепи, подобная ситуация возникать не должна вовсе. Наверняка тебе нужно все классы, для объектов которых, может быть вызван метод LNG неследовать от какого-нибудь базового, в котором этот метод/член определен по умолчанию, или определена реакция на вызов этого члена, а в наследниках уже переопределять.
|
|||
|
||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Ребят, вы меня просто не поняли...
Ладно, обошолся более простым вариантом. |
|||
|
||||
imm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 27.7.2005 Репутация: нет Всего: 1 |
Приношу свои извинения за длительную задержку, но меня твоя проблема очень заинтересовала и я кой-чего написал. Кстати, если есть дерево (по которому мы будем ходить), то можно с помощью этой концепции реализовать что-то типа SimpleXML (я имею ввиду принцип доступа), вручную (а можно и красивее чем SimpleXML, только гора-а-аздо тяжелее
![]()
Это сообщение отредактировал(а) imm - 9.8.2006, 22:13 |
|||
|
||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
imm, я вроде понятно же написал, что мне не МЕТОД нужен, а ЭЛЕМЕНТ МАССИВА, который является СВОЙСТВОМ.
|
|||
|
||||
imm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 27.7.2005 Репутация: нет Всего: 1 |
Ано там так и есть, просто я попутал терминологию, ты запусти, оно работает.
В CMyClass (наследник от CLoader) по необходимости нужно переопределить следующие методы: - В качестве параметров функции передается имя твоего свойства и указанный индекс - Метод возвращает значение, которое необходимо извлеч по паре свойство[индекс] public function getMemberValue($member_name, $index) - Пытается записать в пару свойство[индекс] переданное значение value public function setMemberValue($member_name, $index, $value) - Пытается очистить значение, сохраненное в паре свойство[индекс] public function freeMemberValue($member_name, $index) Простейший пример:
В процессе выполнения последней строки, в объекте $b будет вызвана функция getMemberValue, значения переданных параметров будут: $member_name <- 'myProperty' $index <- 'myIndex' И то, что эта функция возвратит будет записано в $a. |
|||
|
||||
Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Слишком "тяжелый вариант"... Да, жаль нет перегрузки []...
|
|||
|
||||
WIPS |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 22.5.2006 Где: Украина, Киев Репутация: нет Всего: 8 |
Есть какие нибудь идеи, чтобы при вот таком обращении:
в $a возвращался массив
а не объект класса CIndexReader? Долго кручу, пока не могу найти решения. В худшем случае хотелось бы удостовериться, что это невозможно ![]() --------------------
Автопроизводители, машины, марки, модели! |
||||
|
|||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
WIPS, для этого надо хранить там массив.
$instance->LNG = array('index_1' => 'value'); -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
WIPS |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 22.5.2006 Где: Украина, Киев Репутация: нет Всего: 8 |
Fortop, обращения к полю могут идти в любом виде:
хочу, чтоб работало во всех вариантах. CyClon, надо было создать новую тему? --------------------
Автопроизводители, машины, марки, модели! |
|||
|
||||
Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
WIPS,
Ну и что тут сложного? Тебе надо будет работать с __get(), __set(), ArrayAccess. Выше по топику это описано. Или ты не знаешь как инкапсулировать один класс внутри другого? Вот.
-------------------- Мир это Я. Живее всех живых. |
|||
|
||||
WIPS |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 199 Регистрация: 22.5.2006 Где: Украина, Киев Репутация: нет Всего: 8 |
Fortop, очень абстрактное, для меня лично, объяснение. Если не сложно ткните носом (а еще лучше куском кода).
Просто сейчас проблема заключается в следующем, есть код:
в принципе, если я верно рассуждаю, он эквивалентен такому псевдокоду:
что в свою очередь эквивалентно:
т.е., и в случае обращения как к элементу массива, так и в случае обращения как к полю объекта, сначала вызывается __get(), но уже в нем мне надо знать возвращать ли объект, реализующий ArrayAccess, или просто значение запрашиваемого поля. Как инкапсулировать знаю, но пока не вижу что внутри чего нужно "спрятать". Это сообщение отредактировал(а) WIPS - 1.5.2008, 15:39 --------------------
Автопроизводители, машины, марки, модели! |
||||||
|
|||||||
Fortop |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 1 Всего: 42 |
WIPS, обрати внимание, ты хочешь чтобы к любым данным класса можно было обращаться и как к свойству и как к индексу массива.
Для свойства - нужно чтобы класс реализовывал методы __get(), __set() Для доступа через индекс - класс должен реализовывать интерфейс ArrayAccess. Далее, ты хочешь чтобы любой извлекаемый элемент из этого класса тоже обладал такими же особенностями. Это значит что каждый элемент в свою очередь тоже должен реализовывать методы __get(), __set() и интерфейс ArrayAccess. Если ты захочешь чтобы и их элементы в свою очередь обладали такими же особенностями, то и они должны быть представителями этого класса. Вот примерно так
Можно модифицировать методы __get() и OffsetGet() следующим образом
Тогда станет возможным даже такое присвоение.
НО! В этом случае ты не сможешь определять, существует ли соответствующее свойство и индекс. И тебе прийдется писать отдельные методы для этого. В общем извращаться можно как угодно. Совет следующий - определись, как ты будешь получать доступ, как к элементу массива, или как к свойству - так и работай. Иначе сам запутаешься ![]() Вот собственно класс. Соответствующие проверки и Exception - допишешь самостоятельно.
-------------------- Мир это Я. Живее всех живых. |
||||||||
|
|||||||||
IZ@TOP |
|
|||
![]() Панда-бир! ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4795 Регистрация: 3.2.2003 Где: Бамбуковый лес Репутация: 1 Всего: 73 |
Блин, ребята, учите библиотеку SPL!
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |