Так работает отлично, вроде можно успокоиться, но есть другой класс, у которого есть свойство типа вот этого самого объекта, и мне необходимо реализовать внутри нового класса подобный __GET
Как правильно такое реализовать, чтобы работали массивы и объекты?
По идее надо так:
----- "Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
JustUserR
Отправлено: 29 Мая, 2010 - 13:49:37
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Joo пишет:
Опять не работает, для массивов, говорит "Notice: Indirect modification of overloaded property module_sale::$massiv has no effect"
Я пока пришел к такому варианту, он работает, но правильно ли это?
Дело в том что при использовании обработчика __get вы работаете не с реальными свойствами объекта а с используемыми в этой функции значениями - то есть для передачи одного возвращаемого значения по ссылке достаточно указать это в функции или в принимающем значение левом операнде При вызове же вложенных значений объектов надо явно вызывать обрабочик __get как для внутреннего так и для внешнего объекта - именно поэтому внутри обработчика внешнего объекта нужно явно получать ссылку на внутренний объект и возвращать ее
Именно поэтому работает последний вариант поскольку получается некое подобе замыкания - первая ссылка на внутренний объект создается и хранится внутри внутреннего обработчика в определенной переменной - а уже ссылка на саму нее хранится во внешнем коде
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Joo
Отправлено: 29 Мая, 2010 - 14:17:37
Гость
Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2009 Откуда: Казахстан
Помог: 1 раз(а)
JustUserR пишет:
При вызове же вложенных значений объектов надо явно вызывать обрабочик __get как для внутреннего так и для внешнего объекта - именно поэтому внутри обработчика внешнего объекта нужно явно получать ссылку на внутренний объект и возвращать ее
Большое, спасибо, я даже не подумал вызвать у внутреннего объекта __get, теперь нормально работает, так:
----- "Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
JustUserR
Отправлено: 30 Мая, 2010 - 13:03:08
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
Joo пишет:
Большое, спасибо, я даже не подумал вызвать у внутреннего объекта __get, теперь нормально работает, так
Пожалуйста! Кроме того такой способ лучше еще тем что не создает псевдозамыкания во внешней функции __get - и соответстенно не требует двойного разыменовывания по ссылке и лишнего переключения контектса при выполнеии
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Opo6ac
Отправлено: 11 Августа, 2011 - 14:42:57
Новичок
Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2009
Помог: 0 раз(а)
Господа, изменилась ли ситуация в актуальной (5.3) версии PHP?
Честно говоря, я так и не понял, как мне геттером получить значение $this->arr['some_item'], ведь в __get() в таком случает будет передано только "arr", без ключа.
Opo6ac
Отправлено: 17 Августа, 2011 - 10:46:00
Новичок
Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2009
Помог: 0 раз(а)
JustUserR, спасибо. Вчитался, поэкспериментировал - удалось получать элемент по ссылке. Хотя возникла проблема с наследуемыми классами и переопределением __get()
Открыл под этот вопрос отдельную тему с подробным описанием.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.