1

我一直在网上寻求有关如何设计我的 php 类以分离我的业务逻辑和我的数据层的帮助。我已经开始设计一个我认为很酷的类,但后来发现了 PDO 和 ADODB,并有一个很好的表情,意识到我正在重新创建轮子。我现在的问题是我仍然不太了解如何分离我的逻辑和所有 SQL 查询。

我从我的数据库架构中删除了大部分内容并放下这两个表,因为我认为它们很容易理解。假设我有文件,它们在我的服务器上保存在目录中(这些目录可以在其他目录中)。假设我需要一些基本功能,例如从我的一个文件中获取根目录或获取当前目录中的目录列表。

+--------------------+ +----------------+
| Files              | | Directories    |
+--------------------+ +----------------+
| id                 | | id             |
| name               | | name           |
| path               | | directory_id   |
| directory_id       | +----------------+
+--------------------+

一个设计良好的类会是这样的吗:

class Files {
    public function __construct( $file_id ) {}
    public function getDirectory() {}
    public function getRootDirectory() {}
    public function getPath() {}
    public function move( $directory_id ) {}
}

class Directories {
    public function __construct( $directory_id ) {}
    public function getRootDirectory() {}
    public function move( $directory_id ) {}
    public function listContent() {}
}

我会在哪里使用通过构造函数传递的 ID 在构造函数中获取我的对象的所有数据?我应该在构造函数中传递一个 PDO 对象还是我错过了一些有价值的设计模式?所有的 SQL 都应该在这里硬编码吗?我使用 PDO 得到的一件事是我可以很容易地从 MySQL 切换到 MSSQL,但是两者的 SQL 语法不同,所以不会仍然给我带来问题吗?

我知道这些都是理论上的问题,没有一个好的答案,但我缺乏工作同事来讨论这个问题(当我说他们甚至不知道设计模式是什么时我不是在开玩笑)所以我发现自己转向了网络。如果我的问题太模糊,请随意提出一个好的讨论类型的地方,我可以问这种东西,我将非常感激:)

4

2 回答 2

2

很难说这对您的实际情况有多大影响,但您可能应该查看 ORM(对象关系映射)可以为您做什么。有很多很多非常有用的 ORM 解决方案,可以让这些东西变得更简单。当然,它们并不适用于所有解决方案,但 ORM 可以帮助您在中间层(通常)所属的中间层实现逻辑。

于 2011-06-02T20:44:35.747 回答
1

从您的评论中读到,如果您想让您的 SQL 与所有 DMBS 一起工作,我认为您可以使用一些 SQL 抽象层。

我建议你Zend_DB_Select http://framework.zend.com/manual/en/zend.db.select.html

如果您阅读其功能,则说明:

  • 对 SQL 查询的某些部分进行独立于数据库的抽象;
于 2011-06-02T20:47:03.907 回答