<?php
interface DataAccessFactory
{
/**
* @return UserDataAccess
*/
public function createUserDataAccess();
}
interface UserDataAccess
{
/**
* @return boolean
*/
public function insert($user);
}
abstract class AbstractMySQLDataAccess
{
protected $dbh;
/**
* @param PDO $dbh PHP data object
*/
public function __construct(PDO $dbh)
{
$this->dbh = $dbh;
}
}
class MySQLUserDataAccess extends AbstractMySQLDataAccess implements UserDataAccess
{
public function insert($user)
{
// ...
}
}
class MySQLDataAccessFactory implements DataAccessFactory
{
private $dbh;
public function __construct()
{
$this->dbh = new PDO('mysql:host=localhost;', '<user>', '<pswd>');
}
/**
* @see DataAccessFactory::createUserDataAccess()
* @return MySQLUserDataAccess
*/
public function createUserDataAccess()
{
return new MySQLUserDataAccess($this->dbh);
}
}
class UserModel
{
private $factory;
public function __construct(DataAccessFactory $factory)
{
$this->factory = $factory;
}
public function insert()
{
$dataAccess = $this->factory->createUserDataAccess();
if ($dataAccess->insert()) {
// ...
// <business logic />
}
}
}
$model = new UserModel(new MySQLDataAccessFactory());
// ...