由于您已将其标记为mvc,我将假设您的 DAO 已经存在于模型层中。据我了解。DAO 负责与Data Mappers相同的任务,并将来自存储(可能是也可能不是 SQL 数据库)的信息提供给模型层中的域对象。
处理此问题的最佳方法是使用工厂,它在模型层中创建数据访问对象。这将有几个优点:
- 与不同 DAO 的类名解耦
- 知道第一个 DAO 何时初始化的能力
- 在所有 DAO 实例之间共享单个数据库连接
这就是我将如何实现类似的东西:
class DaoFactory
{
protected $connection = null;
protected $provider = null;
public function __construct( $provider )
{
$this->provider = $provider;
}
public function create( $name )
{
if ( $connection === null )
{
$connection = call_user_func( $this->provider );
}
$instance = new $name;
$instance->setConnection( $connection );
return $instance
}
}
用法看起来像这样:
$connectionProvider = function()
{
$instance = new \PDO('mysql:host=localhost;dbname=testdb;charset=utf8',
'username', 'password');
$instance->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$instance->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
return $instance;
};
$daoFactory = new DaoFactory( $connectionProvider );
然后将$daoFactory
变量传递给创建 DAO 所需的任何对象。这样,如果需要,您可以轻松地用完全不同的东西替换工厂(只要它实现相同的create()
方法足迹)。您的领域业务逻辑绝不会受到这种变化的影响。
使用这个工厂的对象完全不知道甚至存在数据库连接,DAO 需要它来运行。当您甚至不需要建立与数据库的连接时,您甚至可能会遇到一些情况。
Rant
由于您的代码库中有数据访问对象,这表明您正在尝试使用 OOP。或者至少是类似的东西。但是静态类/函数/变量不是 OOP 范式的一部分。如果你有一个只包含静态方法和少量静态变量的类,那么你实际上所做的只是带有全局变量的简单 php 函数,包装在一个命名空间中,它恰好看起来像类。
PHP 社区倾向于将此 COP(面向类的编程)称为笑话,但本质上它是过程代码。