PHP 面向对象的数据库访问

标签 php mysql oop

我刚开始使用 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/

相关文章:

mysql 连接问题 - 我这样做对吗

sql - 对 SQL 语句中的特定行应用特定条件

python - 在类似 Django 的表单实现中使用元类有什么好处?

php - 从 Access 获取最后插入 ID

php - 从Mysql中检索数据并存储在选项html标签中

php - Laravel 中 undefined variable : task (View: C:\Users\13\Desktop\TDT\resources\views\files\form.blade.php)

c# - 从父 C# 调用子方法

oop - matlab subsref : {} with string argument fails, 为什么?

php - 向用户显示他已注销

php - 如何从 PHP 脚本转到新的 Html 页面?