Building an Identity Map in PHP: Retrieve objects avoiding multiple instances

Recommend this page to a friend!
  Info   View files (22)   Download .zip   Reputation   Support forum (1)   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2020-03-25 (4 months ago) Not enough user ratingsTotal: 482 All time: 5,854 This week: 430
Version License PHP version Categories
php-identity-map 1BSD License5.0PHP 5, Databases, Design Patterns
Description Author

This package can store and retrieve objects in persistent storage containers avoiding to have multiple instances of the same object in memory.

It can use a mapper class to store objects of a class in a container like for instance a database table.

It can also retrieve the objects from the container assuring that only one instance of the same object is retrieved into memory.

Picture of Gjero Krsteski
  Performance   Level  
Name: Gjero Krsteski <contact>
Classes: 4 packages by
Country: Germany Germany
Age: 40
All time rank: 1609103 in Germany Germany
Week rank: 771 38 in Germany Germany
Innovation award
Innovation award
Nominee: 2x

Building an Identity Map in PHP

Sample application used for training.

This example code is no production code and should be used for training
purposes only.

This example code requires:
* PDO a lightweight, consistent interface for accessing databases in PHP.
* PHPUnit a unit testing framework for PHP projects.

This example code implements:
* Data-Mapper Pattern
* Identity-Map Pattern

Why identity mapping?
By using Data-Mapper pattern without an identity map, you can easily run
into problems because you may have more than one object that references
the same domain entity.

Data-Mapper without identity map

      $userMapper = new UserMapper($pdo);

      $user1 = $userMapper->find(1); // creates new object
      $user2 = $userMapper->find(1); // creates new object

      echo $user1->getNickname(); // joe123
      echo $user2->getNickname(); // joe123


      echo $user1->getNickname(); // bob78
      echo $user2->getNickname(); // joe123 -> ?!?

Data-Mapper with identity map
The identity map solves this problem by acting as a registry for all
loaded domain instances.

      $userMapper = new UserMapper($pdo);

      $user1 = $userMapper->find(1); // creates new object
      $user2 = $userMapper->find(1); // returns same object

      echo $user1->getNickname(); // joe123
      echo $user2->getNickname(); // joe123


      echo $user1->getNickname(); // bob78
      echo $user2->getNickname(); // bob78 -> yes, much better

By using an identity map you can be confident that your domain entity is
shared throughout your application for the duration of the request.

Note that using an identity map is not the same as adding a cache layer
to your mappers. Although caching is useful and encouraged, it can still
produce duplicate objects for the same domain entity.

Load the Data-Mappers with the Repository class

      $repository = new Repository($this->db);
      $userMapper = $repository->load('User');
      $insertId = $userMapper->insert(new User('billy', 'gatter'));
File Role Description
database (2 files)
src (1 file, 3 directories)
tests (1 file, 2 directories)
autoload.php Class autoloder
phpunit.xml.dist Data phpunit configuration
README.markdown Doc. README
test-bootstrap.php Aux. bootstraping

  Files  /  database  
File Role Description
   tbl_article.sql Data Auxiliary data
   tbl_user.sql Data Auxiliary data

  Files  /  src  
File Role Description
framework (3 files)
model (2 files)
persistence (3 files)
   Repository.php Class Class source

  Files  /  src  /  framework  
File Role Description
   IdentityMap.php Class the indentity-map
   MapperException.php Class mapper exception
   RecursiveClassLoder.php Class Class source

  Files  /  src  /  model  
File Role Description
   Article.php Class Class source
   User.php Class the user model

  Files  /  src  /  persistence  
File Role Description
   AbstractMapper.php Class Class source
   ArticleMapper.php Class Class source
   UserMapper.php Class the user mapper

  Files  /  tests  
File Role Description
model (2 files)
persistence (2 files, 1 directory)
   RepositoryTest.php Class Class source

  Files  /  tests  /  model  
File Role Description
   ArticleTest.php Class Class source
   UserTest.php Test user model test

  Files  /  tests  /  persistence  
File Role Description
fixture (2 files)
   ArticleMapperTest.php Class Class source
   UserMapperTest.php Test UserMapperTest

  Files  /  tests  /  persistence  /  fixture  
File Role Description
   article-seed.xml Data Auxiliary data
   user-seed.xml Data user-seed

 Version Control Unique User Downloads Download Rankings  
This week:0
All time:5,854
This week:430
User Comments (1)

For more information send a message to info at phpclasses dot org.