【发布时间】:2016-01-11 06:06:04
【问题描述】:
我正在创建一个 PHP Web 应用程序,它使用 8 个类(更多类)。我意识到所有这些类都具有几乎相同的访问数据库的功能:get_single、get_list、插入、更新和删除。
对于每个课程来说,处理哪个数据库表以及选择哪些字段是不同的。
例如:
function get_single($conn) {
$sql = $conn->prepare('SELECT id_person, join_date, img_profile, img_header, firstname, familyname, nationality, mail, password, birthday FROM person WHERE id_person = ?');
$sql->bind_param('i', $this->id);
$sql->execute();
$sql->bind_result($this->id, $this->join_date, $this->profile_img, $this->header_img, $this->firstname, $this->familyname, $this->nationality, $this->mail, $this->password, $this->birthday);
$sql->fetch();
return $this;
}
我问自己是否可以或应该为所有类编写一个函数,如下所示:
function get_single($id, $conn, $query) {
$sql = $conn->prepare($query);
$sql->bind_param('i', $id);
$sql->execute();
$sql->bind_result(/* ??? */);
$sql->fetch();
return /* ??? */ ;
}
...然后调用
$foo = new Foo(array('id' => $bar));
$foo = get_single($foo->id, $conn, $qry_single_foo);
这样我可以
- 集中存储所有 SQL 查询
- 减少代码总量
- 提高可读性...也许?
或者我应该有一个父类来继承这些类吗?
或者使用设计模式?也许是装饰师? (对不起,我的知识相当不存在)
现在我意识到可能以不同的方式更容易做到这一点,我有点不知所措。
想法?
谢谢
【问题讨论】:
-
问题,存在“紧密耦合”,你的类是潜在的“上帝对象”。你可能想看看存储库设计模式..code.tutsplus.com/tutorials/…
-
好吧,我不完全确定我是否使用 MVC... 我有一些类可以通过查询和所有内容进行所有数据库连接。我有一个 index.php,其中大部分业务逻辑都在其中发生,并且我在其中包含了不同的页面,它们完成了所有的显示工作(所有的 HTML)。
-
你是对的方式..但主要问题是很难用 php 学习实现 OOP,因为它起源于脚本语言..而且 OOP 是一个大世界..可能还有其他一些设计模式等来解决您的问题,但您的问题是指存储库设计模式..它是最容易理解的一种..
-
我有点困惑(而且我的代码有点错误)。我这样称呼
get_single()-函数:$p->get_single($conn)。在我调用该函数之前,$p已经是所需类型的对象,但除了 ID 之外是空的。该功能只是填充它。那么为什么要使用工厂来创建一个已经存在的对象呢?其次,我仍然不确定应该如何概括bind_result()-function,以便所有类都可以使用它?一些类(或数据库表)有一个“名字”例如,其他有一个“描述”或“文件名”,必须用结果填充......到目前为止谢谢:) -
工厂模式和存储库模式是不同的模式,但大多一起使用。工厂模式不是关于如何“调用对象”,而是关于如何“创建对象”。和 bind_result()函数是一个 mysql 方法..所以你可以在你的数据库对象上使用它..并且存储库模式用于 CRUD 操作..
标签: php mysql redundancy