gpt4 book ai didi

PHP DataMapper 模式 : My class needs an instance of PDO, 我想将它包装在 Db 类中

转载 作者:搜寻专家 更新时间:2023-10-31 21:10:01 25 4
gpt4 key购买 nike

这是我所拥有的:

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();
}
}

}

现在,这是我在我的 View 文件中使用它的方式(目前只是测试插入命令):

$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());

关于PHP DataMapper 模式 : My class needs an instance of PDO, 我想将它包装在 Db 类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22120515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com