gpt4 book ai didi

PHP 面向对象的数据库访问

转载 作者:行者123 更新时间:2023-11-29 04:43:01 24 4
gpt4 key购买 nike

我刚开始使用 PHP 的面向对象范例,所以我可能错过了一些明显的东西。

我有一个 Question 类,它有多个子类用于不同风格的问题,其实例可以从 MySQL 数据库创建,也可以由用户在表单中创建。但是,如果它是由用户创建的,它在数据库中还没有任何附加到它的自动递增 ID。

解决此问题的最佳方法是什么?不幸的是,我有点难过。

在用户创建的 Question 被添加到数据库之前,我是否应该使用不同的类?我应该让它们成为同一个类,但根据来源使用不同的方法来实例化它们吗?还有别的吗?

最佳答案

首先,您的Question 类首先应该与数据库无关。它们应该纯粹是愚蠢的域对象,它只保存数据并可能对其执行一些数据验证:

class Question {

protected $title;
protected $body;

...

public function setTitle($title) {
if (strlen($title) == 0) {
throw new InvalidArgumentException(...);
}
$this->title = $title;
}

public function getTitle() {
return $this->title;
}

...

}

根据您的要求,您可以通过在构造函数中要求它们来使其中一些属性成为必需的。通过这样做,您可以确保如果您有一个 Question 实例,它至少具有使其成为有效问题的最少属性:

public function __construct($title) {
$this->setTitle($title);
}

再次注意,这个对象完全没有什么是数据库的概念。这是其他一些类的职责,它可以访问数据库连接器并可以读取 Question 对象以将它们存储在数据库中并从数据库数据创建新的 Question 对象:

class QuestionStore {

protected $db;

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

public function getQuestion(...) {
$data = $this->db->query('SELECT ...');

$question = new Question($data['title']);
$question->setBody($data['body']);
return $question;
}

}

(您可以讨论是否将这些职责进一步划分为工厂等,但您已经了解了基本思想。)

然后如何处理 ID 就变得非常简单了。要么您只是将 id 作为 Question 类的非必需属性之一,因此一些 Question 实例具有 id,而其他实例则没有保存在数据库中。或者,如果更容易区分这两种类型的问题对您的代码来说有些重要,请从中创建一个子类型:

class StoredQuestion extends Question {

protected $id;

public function __construct($id, $title) {
$this->setId($id);
parent::__construct($title);
}

...

}

关于PHP 面向对象的数据库访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24594760/

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