A Data Mapper, is a Data Access Layer that performs bidirectional
transfer of data between a persistent data store (often a relational
database) and an in memory data representation (the domain layer). The
goal of the pattern is to keep the in memory representation and the
persistent data store independent of each other and the data mapper
itself. The layer is composed of one or more mappers (or Data Access
Objects), performing the data transfer. Mapper implementations vary in
scope. Generic mappers will handle many different domain entity types,
dedicated mappers will handle one or a few.

The key point of this pattern is, unlike Active Record pattern, the data
model follows Single Responsibility Principle.

<?phpnamespaceDesignPatterns\Structural\DataMapper;classUserMapper{/** * @var StorageAdapter */private$adapter;/** * @param StorageAdapter $storage */publicfunction__construct(StorageAdapter$storage){$this->adapter=$storage;}/** * finds a user from storage based on ID and returns a User object located * in memory. Normally this kind of logic will be implemented using the Repository pattern. * However the important part is in mapRowToUser() below, that will create a business object from the * data fetched from storage * * @param int $id * * @return User */publicfunctionfindById(int$id):User{$result=$this->adapter->find($id);if($result===null){thrownew\InvalidArgumentException("User #$id not found");}return$this->mapRowToUser($result);}privatefunctionmapRowToUser(array$row):User{returnUser::fromState($row);}}