PHP DataMapper 模式:我的类需要 PDO 实例,我想将其包装在 Db 类中

2023-12-21

这就是我所拥有的:

class Entry
{
    public $id;
    public $name;
    public $seoName;
    public $timeCreated;

    public function someFunction()
    {

    }

}

class EntryMapper
{
    protected $db;

    public function __construct(PDO $db)
    {
        $this->db = $db;
    }

    public function saveEntry(Entry &$entry)
    {
        if($entry->id){
            $sql = "";
    }
    else {
        $sql = "INSERT INTO tbl_entry (name, seo_name, time_created) VALUES (:name, :seo_name, :time_created)";
        $stmt = $this->db->prepare($sql);
        $stmt->bindParam("name", $entry->name);
        $stmt->bindParam("seo_name", $entry->seoName);
        $stmt->bindParam("time_created", $entry->timeCreated);
        $stmt->execute();
        $entry->id = $this->db->lastInsertId();
        }
    }

}

现在,这是我在视图文件中使用它的方法(当前只是测试插入命令):

$entry = new Entry();

$entry->name = "Some Company LLC";
$entry->seoName = "some-company-llc";
$entry->timeCreated = date("Y-m-d H:i:s");

$entryMapper = new EntryMapper(new PDO("mysql:host=....."));
$entryMapper->saveEntry($entry);

我想要这样的 $entryMapper 行:

$entryMapper = new EntryMapper(new Database());

这意味着我应该有一个单独的类 Database.php 来建立连接。

我尝试过,但由于我的类 EntryMapper.php 直接需要 PDO 实例,所以我收到错误。我尝试过从 PDO 扩展数据库,但这也会引发错误,指出 EntryMapper 中未调用 PDO 构造函数

有什么想法吗?

编辑:如果您看到任何代码耦合或类似的迹象,请告诉我,因为我想学习正确的编码。非常感谢!


您可以使用工厂模式并在数据库类的函数中创建 PDO 对象。

class Database {
    private const connStr = 'mysql:host=.....';

    public static function createPDODatabase() {
        return new PDO(connStr);
    }
}

因此,您可以将 EntryMapper 构造函数调用为:

$entryMapper = new EntryMapper(Database::createPDODatabase());

编辑:如果您想通过实例化数据库对象来完成此操作,则应该在数据库类的构造函数中调用 PDO 构造函数。

class Database extends PDO {
    public function __construct($dbname='db_name', $server='localhost', $username='db_user', $password='db_password') {
        parent::__construct("mysql:host=$server;dbname=$dbname", $username, $password);
        parent::setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    }
}

然后您可以实例化数据库对象。

$entryMapper = new EntryMapper(new Database());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP DataMapper 模式:我的类需要 PDO 实例,我想将其包装在 Db 类中 的相关文章

随机推荐