![]() |
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]() ![]() ![]() |
|
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!
-------------------- Один из розовых плюшевых-всадников апокалипсиса... очень злой... Семь кругов ада для новых элементов языка Мои разрозненные мысли |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | PHP: Для профи | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |