__get, __set, наследование и ORM

master_x

Pitavale XXI wieku
__get, __set, наследование и ORM

В общем, есть у меня ORM класс. Для сопоставления с полями таблицы используются геттеры и сеттеры (создавать реальное свойство объекта на каждое поле таблицы некрасиво, потому как внутри класса есть свои уже определенные свойства и может получиться конфликт имен? а кстати и с геттерами-сеттерами может тоже получиться конфликт... даже если предопределенные свойства--private... вопрос первый- как тут поступить? в adodb кстати для четвертой версии php используется именно реальное определение свойств в соответствии с полями таблицы).
Есть у меня также базовый класс (Base), от которого все наследуют. У этого класса геттеры-сеттеры используются для доступа к объектам в реестре. Поясняю: в любом месте класса Foo который наследует Base я могу обратиться к $this->Xsession, и благодаря геттеру в базовом классе я получу объект session из реестра. Способ удобен тем, что не надо везде где понадобиться вызывать стат. метод реестра. Вопрос: геттеры-сеттеры нужны и в Base и в ORM и может быть много где еще... как поступить?
Спасибо.
 

zerkms

TDD infected
Команда форума
вторая половина как то невнятно описана, а по поводу свойств - храни данные в массиве (датаспейсе), а не свойствах объекта
 

zerkms

TDD infected
Команда форума
master_x
а клиентскому коду принципиально - как внутри объекта хранятся данные?????
 

master_x

Pitavale XXI wieku
zerkms
наверное я не правильно понял... но данные итак хранятся в массиве, при помощи геттера оттуда втаскиваются. Но! если к примеру у нас есть private $table и где нибудь внутри ORM класса мы попытаемся обратиться к полю table в таблице то получится конфликт, потому как геттер не сработает.
 

zerkms

TDD infected
Команда форума
master_x
именно поэтому ты должен:

1. называть члены класса так, чтобы свести к минимуму такую вероятность
2. вспомнить об инкапсуляции
 

master_x

Pitavale XXI wieku
zerkms
вероятность то снизится, но останется... а по второму вопросу?
если что непонятно то спрашивай я объясню, пока ситуация такова:
есть реестр, в нем объекты.
есть класс Base, от которого все наследуют.
в классе Base getter сделан таким образом, что он возращает объект из реестра по имени.
Вопрос что сделать, как избежать конфликта между getter ORM и getter Base?
 

zerkms

TDD infected
Команда форума
перечитал раз 5.. не понял ;(
связи между регистри и ОРМ объекта, который хранится в нём отследить и придумать не могу
 

master_x

Pitavale XXI wieku
ладно постараюсь показать абстрактный код:
PHP:
class Base {
    function __get($name)
    {
          return Registry::getObj($name);
    }
}

class ORM extends Base{
     function __get($name)
     {
           return $this->fields[$name];
     }
}

class Farm extends ORM {
      function __construct()
      {
           echo $this->Xsession;
           /* конфликт, надо вернуть 
              либо объект из реестра, либо    
              поле, которое замаплено... как быть? */
      }
}
в общем-то наврное инкапсуляция
 

Andreika

"PHP for nubies" reader
можно еще раз для последнего ряда повторить?

PHP:
class Base { 
    function __get($name)  { return '123456';  } 
} 

class ORM extends Base{ 
	
    function test() { 	echo $this->tests;	 } 
    function __get($name) { 
           return $this->fields[$name]; 
     } 
}
при вызове test() объекта ORM вызовется ORM->__get, а не Base->__get но вас это почему-то не беспокоит, а вот Farm вы хотите заставить работать как-то по особенному?
 

master_x

Pitavale XXI wieku
Andreika
я прекрасно понимаю, что произойдет перегрузка.
/* конфликт, надо вернуть
либо объект из реестра, либо
поле, которое замаплено... как быть? */
здесь я говорил не о конфликте, который возник реально (потому как реальо он не возникнет, будет попытка естественно вернуть поле а не объект из реестра, так как __get перегружен) а об архитектурном конфликте, потому, как мне нужна и та и другая фнукциональность, и возврат объекта в подходящем случае и возврат поля в другом случае... в общем выкрутился, инкапсуляция здесь как нельзя кстати.

-~{}~ 17.05.06 16:54:

можно выкрутиться так, но это некрасивый вариант, вызывать все геттеры по цепочке:
class ORM extends Base{
function __get($name)
{
$x=parent::__get($name);
/* здесь проверка результата
(если нет объекта в реестре) */
return $что_нибудь_непонятно_что;
}
}
 

Andreika

"PHP for nubies" reader
можно и так выкрутиться... а как надо? как у вас получилось? а то непонятное какое-то слово инкапсуляция(переводить не надо)
 
Сверху