Ответ 1
Идея заключается в том, чтобы иметь стандартный объект, который представляет текущее состояние в реальной жизни или, другими словами, в домене. Эта модель домена обычно представляет собой набор данных без логики.
class person_DO {
public $id;
public $firstname;
public $lastname;
public $addresses;
}
Загрузка экземпляров этой модели домена (объектов домена) и персистентности осуществляется с помощью карт данных - например, адрес вышеуказанного человека может быть расположен в другой таблице через отношение 1: n, как таковое:
TABLE person {
id INTEGER PRIMARY KEY,
firstname VARCHAR(32),
lastname VARCHAR(32)
}
TABLE addresses {
id INTEGER PRIMARY KEY,
person_id INTEGER FOREIGN KEY ON person.id, --Reference on person-row
street VARCHAR(64),
...
}
Person_DO не нужно знать об этом, но datamapper делает это, поскольку он должен собирать данные во время загрузки и разделить при сохранении:
class person_DM {
/**
* @param [integer] $id
* @return [person_DO] an instance of a person or null, if no person
* with that id was found.
*/
public function findById ($id) {...}
/**
* @return [array of person_DO]
*/
public function fetchAll() {...}
/**
* persists a person object
* @param [person_DO] an instance of a person
*/
public function saveOrUpdate(person_DO $person) {...}
}
Чтобы разделить разные части еще больше, DataMappers обычно используют шлюз DbTable или аналогичный шаблон, позволяющий использовать разные базы данных или подобные действия. Таким образом, я могу иметь несколько баз данных с одинаковыми схемами, но, например, в разных организациях создать хранилище данных с тем же кодом, только разные объекты базы данных.
В качестве практического примера я бы предложил посмотреть Учебное пособие по быстрому запуску в Zend Framework, которое делает именно то, что я только что объяснил кратко.