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
Форумы портала PHP.SU :: Версия для печати :: ООП __GET и массивы
Форумы портала PHP.SU » » Объектно-ориентированное программирование » ООП __GET и массивы

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

1. Joo - 29 Мая, 2010 - 12:01:10 - перейти к сообщению
Здравствуйте!
У меня такой вопрос, есть класс в котором реализован метод __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. }
2. JustUserR - 29 Мая, 2010 - 13:49:37 - перейти к сообщению
Joo пишет:
Опять не работает, для массивов, говорит "Notice: Indirect modification of overloaded property module_sale::$massiv has no effect"
Я пока пришел к такому варианту, он работает, но правильно ли это?
Дело в том что при использовании обработчика __get вы работаете не с реальными свойствами объекта а с используемыми в этой функции значениями - то есть для передачи одного возвращаемого значения по ссылке достаточно указать это в функции или в принимающем значение левом операнде При вызове же вложенных значений объектов надо явно вызывать обрабочик __get как для внутреннего так и для внешнего объекта - именно поэтому внутри обработчика внешнего объекта нужно явно получать ссылку на внутренний объект и возвращать ее
Именно поэтому работает последний вариант поскольку получается некое подобе замыкания - первая ссылка на внутренний объект создается и хранится внутри внутреннего обработчика в определенной переменной - а уже ссылка на саму нее хранится во внешнем коде
3. Joo - 29 Мая, 2010 - 14:17:37 - перейти к сообщению
JustUserR пишет:
При вызове же вложенных значений объектов надо явно вызывать обрабочик __get как для внутреннего так и для внешнего объекта - именно поэтому внутри обработчика внешнего объекта нужно явно получать ссылку на внутренний объект и возвращать ее

Большое, спасибо, я даже не подумал вызвать у внутреннего объекта __get, теперь нормально работает, так:
PHP:
скопировать код в буфер обмена
  1.  
  2. public function &__get($name){
  3.     //pGet - это объект нашего первого класса
  4.     return $this->pGet->__get($name);
  5. }
4. JustUserR - 30 Мая, 2010 - 13:03:08 - перейти к сообщению
Joo пишет:
Большое, спасибо, я даже не подумал вызвать у внутреннего объекта __get, теперь нормально работает, так
Пожалуйста! Кроме того такой способ лучше еще тем что не создает псевдозамыкания во внешней функции __get - и соответстенно не требует двойного разыменовывания по ссылке и лишнего переключения контектса при выполнеии
5. Opo6ac - 11 Августа, 2011 - 14:42:57 - перейти к сообщению
Господа, изменилась ли ситуация в актуальной (5.3) версии PHP?
Честно говоря, я так и не понял, как мне геттером получить значение $this->arr['some_item'], ведь в __get() в таком случает будет передано только "arr", без ключа.
6. Opo6ac - 17 Августа, 2011 - 10:46:00 - перейти к сообщению
JustUserR, спасибо. Вчитался, поэкспериментировал - удалось получать элемент по ссылке. Хотя возникла проблема с наследуемыми классами и переопределением __get()
Открыл под этот вопрос отдельную тему с подробным описанием.

 

Powered by ExBB FM 1.0 RC1