Установщики / получатели PHP Data Mapper - PullRequest
1 голос
/ 23 июля 2011

Мне предложили использовать Mappers, чтобы отделить хранилище объектов в БД от реального поведения объекта, что звучит как хорошая идея. Но будучи привыкшим к другим языкам ООП, таким как Java или SmallTalk, я всегда стараюсь максимально инкапсулировать свои объекты. Я прочитал несколько примеров мапперов, и некоторые из них обращаются к переменным объекта домена напрямую (это будет мой последний выбор, хотя я знаю, что это более удобно).

Единственное решение, которое я сейчас придумаю, это что-то вроде:

class User{
   public __construct($mapped_data){
   foreach($data as $key=>$value){
      $this->$key=$value;
   }
...
}

class UserMapper{
   private populate($user,$db_data){
      ...
      $map=array('id'=>'id','psw'=>'password','mail'=>'email', ...);
      foreach($db_data as $key=>$value){
         $mapped_data[$map[$key]]=$value;
      }
      return new User($mapped_data);
   }
}

Карта состоит в том, что класс User вообще не должен знать имена столбцов БД.

Правильный ли этот подход? Есть ли лучший? Спасибо

1 Ответ

2 голосов
/ 23 июля 2011

Я бы предположил, что Объекты доступа к данным являются более подходящим шаблоном для того, чего вы хотите достичь. Картограф, который вы показываете выше, только увеличивает сложность, но на самом деле не дает много преимуществ.

Что касается геттеров и сеттеров, вы можете использовать некоторые из магических методов PHP , чтобы очистить приведенный выше код. Следующее позволяет вам хранить ваши данные в защищенном массиве, предоставляя доступ к нему, который выглядит так, как будто это только через свойство объекта, но на самом деле через метод (так что вы можете предоставить свою собственную логику там; сделать вещи только для чтения, или скрыть некоторые и т. д.).

<?php
class User {
protected $_data = array();
public function __construct($data) {
    $this->_data = $data;
}

// Get any value
public function __get($key) {
    return array_key_exists($key, $this->_data) ? $this->_data[$key] : null;
}

// Set any value; leave out to make the data read only outside the class
public function __set($key, $val) {
    $this->_data[$key] = $val;
}

// You should also implement __isset() and __unset()
}

Затем вы можете получить доступ к данным, как

<?php
$user = new User(array('foo' => 'bar'));

// Outputs "bar"
echo $user->foo;

Вы также можете упростить все это для себя, используя существующую PHP ORM библиотеку .

...