4

我目前正在学习在 PHP 中使用 OOP 进行编码,并且经常遇到数据库类和抽象层。我正在编写一个 CMS 作为一个巨大的挑战,我开始编写一个数据库类而没有考虑太多。

我实际上倾向于按原样使用 MySQLi(我认为按原样使用非常好),而不是创建一个类来处理 CRUD 操作,所以我真的需要一个类来处理所有这些东西吗?

如果不是,那么连接到数据库的最佳方法是什么,只需在我的应用程序开始时进行并传递连接?或者编写一个我缺少的数据库类真的有很大的好处吗?

我认为错误处理将是一个这样的好处,但如果我让我的课程尽可能接近 MySQLi,那么这是继续上课的充分理由吗?

4

2 回答 2

7

主要好处是,如果您可以让所有代码通过您的数据库对象。您可以在将来轻松更改数据库实现。您说您正在学习 mysqli,但说在您更改为 PDO 的中途,您将不得不重构 -everything-。

使用您的自定义数据库对象,您可以简单地更改集成而不影响其余代码。例如,您的 objects->connect() 函数仍然可以像现在一样被调用,但底层代码会发生变化,因为它都在您的自定义类中,所以您所做的更改是最小的。

这只是众多好处之一。与数据库对象接口以运行查询和存储结果的自定义类很常见(MVC 的模型部分 - 通常扩展一个公共基础对象,通常称为 RecordSet 或类似的具有运行选择/更新/删除功能/ETC)。同样,您可以轻松地将实现从一种方法更改为另一种方法。

我所描述的是面向对象编程的一个非常普遍的优势。请参阅您的常识的答案以获得另一个好处。

于 2013-04-22T11:47:08.197 回答
3

谢谢你的好问题。

PHP OOP 数据库类 - 真的需要吗?

绝对可以,但前提是您不喜欢在代码中执行的每个查询都出现大量重复代码。

如果您重新审视执行一个平均查询所需的代码,您可能会注意到它的数量非常可怕。虽然您只需要定义一个查询、传递变量、运行它并获得结果,但您必须编写数千个无用的运算符,并为每个查询重复。

手册中的示例(即使没有错误处理)

if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    $stmt->bind_param("s", $city);
    $stmt->execute();
    $stmt->bind_result($district);
    $stmt->fetch();
    echo $district;
}

使用数据库助手类的示例:

$district = $db->getOne("SELECT District FROM City WHERE Name=?s", $city);
echo $district;

这仅适用于单行。对于行数组,如果使用原始 API,代码量将加倍

如果使用 mysqli,情况会变得更糟。

让我们举个简单的例子。想象有一个未知大小的 id 数组。您需要在简单查询中将它们全部添加到 IN 语句中

SELECT * FROM t WHERE id IN (1,2,3) // filled from array.

尝试使用 mysqli 准备好的语句获取数据

于 2013-04-22T12:11:27.383 回答