Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ООП __GET и массивы

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Notice: Indirect modification of overloaded property module_sale::$massiv has no effect
Joo
Отправлено: 29 Мая, 2010 - 12:01:10
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2009  
Откуда: Казахстан


Помог: 1 раз(а)




Здравствуйте!
У меня такой вопрос, есть класс в котором реализован метод __GET

PHP:
скопировать код в буфер обмена
  1. public function __GET($name){
  2.   return $this->vars[$name];
  3. }
  4.  

Так не работает если работать с массивами

так, не чего не получается и изменения в $this->var не происходит, но оно и ясно, так-как мы вернули копию объекта.

Второй вариант вернуть сылку:
PHP:
скопировать код в буфер обмена
  1. public function &__GET($name){
  2.   return $this->vars[$name];
  3. }

Так работает отлично, вроде можно успокоиться, но есть другой класс, у которого есть свойство типа вот этого самого объекта, и мне необходимо реализовать внутри нового класса подобный __GET
Как правильно такое реализовать, чтобы работали массивы и объекты?
По идее надо так:
PHP:
скопировать код в буфер обмена
  1. public function &__GET($name){
  2.   //pGet - это объект нашего первого класса
  3.   return $this->pGet->$name;
  4. }

Но так не работает, ссылку на ссылку говорит не переадть, хорошо, так:
PHP:
скопировать код в буфер обмена
  1. public function __GET($name){
  2.   //pGet - это объект нашего первого класса
  3.   return $this->pGet->$name;
  4. }

Опять не работает, для массивов, говорит "Notice: Indirect modification of overloaded property module_sale::$massiv has no effect"

Я пока пришел к такому варианту, он работает, но правильно ли это?
PHP:
скопировать код в буфер обмена
  1. public function &__GET($name){
  2.   //pGet - это объект нашего первого класса
  3.   $ret = &$this->pGet->$name;
  4.   return $ret;
  5. }


-----
"Им будет не просто, тем кто полагается на истину авторитета, вместо ​того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
 
 Top
JustUserR
Отправлено: 29 Мая, 2010 - 13:49:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 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/
 
 Top
Joo
Отправлено: 29 Мая, 2010 - 14:17:37
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2009  
Откуда: Казахстан


Помог: 1 раз(а)




JustUserR пишет:
При вызове же вложенных значений объектов надо явно вызывать обрабочик __get как для внутреннего так и для внешнего объекта - именно поэтому внутри обработчика внешнего объекта нужно явно получать ссылку на внутренний объект и возвращать ее

Большое, спасибо, я даже не подумал вызвать у внутреннего объекта __get, теперь нормально работает, так:
PHP:
скопировать код в буфер обмена
  1.  
  2. public function &__get($name){
  3.     //pGet - это объект нашего первого класса
  4.     return $this->pGet->__get($name);
  5. }


-----
"Им будет не просто, тем кто полагается на истину авторитета, вместо ​того чтобы полагаться на авторитет Истины"
Джеральд Месси, Египтолог
 
 Top
JustUserR
Отправлено: 30 Мая, 2010 - 13:03:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Joo пишет:
Большое, спасибо, я даже не подумал вызвать у внутреннего объекта __get, теперь нормально работает, так
Пожалуйста! Кроме того такой способ лучше еще тем что не создает псевдозамыкания во внешней функции __get - и соответстенно не требует двойного разыменовывания по ссылке и лишнего переключения контектса при выполнеии


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Opo6ac
Отправлено: 11 Августа, 2011 - 14:42:57
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




Господа, изменилась ли ситуация в актуальной (5.3) версии PHP?
Честно говоря, я так и не понял, как мне геттером получить значение $this->arr['some_item'], ведь в __get() в таком случает будет передано только "arr", без ключа.
 
 Top
Opo6ac
Отправлено: 17 Августа, 2011 - 10:46:00
Post Id


Новичок


Покинул форум
Сообщений всего: 21
Дата рег-ции: Сент. 2009  


Помог: 0 раз(а)




JustUserR, спасибо. Вчитался, поэкспериментировал - удалось получать элемент по ссылке. Хотя возникла проблема с наследуемыми классами и переопределением __get()
Открыл под этот вопрос отдельную тему с подробным описанием.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB