关于型号
实际上,模型首先不在课堂上。模型是一个层,其中包含大量对象。模型层中的两个主要类实例组负责以下职责之一:
- 领域业务逻辑和规则:由领域对象实现(一) (二)
- 数据访问和持久性:通常实现为数据映射器(3)
在代码中,它看起来类似于:
$user = $factory->buildObject('user');
$mapper = $factory->buildMapper('user');
$user->setId( 42 );
$mapper->fetch($user);
$now = time();
if ( $user->hasStatus( User::STATUS_LOCKED ) && !$user->isBanned( $now ) )
{
$user->setStatus( User::STATUS_AVAILABLE );
}
$mapper->commit($user);
您可能会注意到,业务对象在任何时候都不会真正与数据库交互。或者甚至意识到这一点。信息可能存储在纯文本文件中,或通过远程 REST API 或某些 noSQL 事物存储。域对象不关心这一点。所有存储都由映射器处理。控制发票制作的业务逻辑不依赖于发票信息的来源。
关于连接
由于您使用的是 OOP,因此您可能会利用它。考虑这个例子:
class Test
{
protected $ob = null;
public function __construct( $ob )
{
$this->ob = $ob;
}
public function get()
{
var_dump( $this->ob->data );
}
public function set( $val )
{
$this->ob->data = $val;
}
}
$object = new stdClass;
$foo = new Test($object);
$bar = new Test($object);
$foo->set('lorem ipsum');
$bar->get();
要查看执行:http ://codepad.org/coCibwyk
您应该注意到,Test
类的两个实例共享同一个实例。在您的代码中,您可以对PDO的实例执行相同的操作。
如果您使用类似于第一个代码剪切的东西,那么:
class Factory
{
protected $connection = null;
public function __construct( $connection )
{
$this->connection = $connection;
}
public function buildMapper( $className )
{
$className = $className . 'Mapper';
$instance = new $className ;
$instance->useConnection( $this->connection );
return $instance;
}
// ... some other code
}
因此,当您使用 时$mapper = $factory->buildMapper('user');
,该方法会创建一个已经有连接的对象。