2

假设我有以下数据:

// Users Table

+----+-------+----------+
| ID | first | last     |
+----+-------+----------+
|  1 | Al    | Anderson |
|  2 | Bob   | Blakely  |
|  3 | Cal   | Cambel   |
+----+-------+----------+

和以下课程:

// Users.php

class Users {

    public $first;
    public $last;

    ...

}

我需要从查询结果中实例化用户对象并返回一个对象数组。我不知道哪种方法更好:

静态方法

在类文件中封装如下伪代码:

public static function getAll() {
    $myUsers = array();
    ...
    foreach ($results as $row) {
        $user = new User();
        ...
        $myUsers[] = $user;
    }
    return $myUsers;
}

并这样称呼它:

$allUsers = Users::getAll();

常规功能

像静态方法一样工作,但也许我可以重构以与其他对象一起工作......

function getAll($objType='Users') {
    $myArray = new array();
    ...
    return $myArray;
}

哪种方法更好?

我喜欢将它封装在一个类函数中,但处理静态数据库连接对象更痛苦。我喜欢简单的“帮助”功能,但这只会将 OOP 抛诸脑后。我该怎么办?

***更新:这不是 MySQLi 或 PDO 的事情。我在问(仅从 OOP 最佳实践的角度)是在类中放置一个静态的“getAllOfMyself()”方法更好,还是更好地使用像“getAllSomethings()”这样的简单函数。

4

1 回答 1

1

我的意见是你应该将工厂模式与 Singleton 结合起来(无论如何这在工厂中很常见)。您对静态方法的建议本质上是一个工厂,但您可以/应该在这个方向上进一步考虑它。使用 getUserByID() 和 getAllActiveUsers()... 等方法创建一个名为 UserFactory 的类。这些可以(并且应该是)静态方法;但是,您可以将其设为单例,并且这些方法中的每一个都可以在实例上调用类似名称的私有方法(_getUserByID()、_getAllActiveUsers())。该实例可以管理您的数据库连接,然后您可以在将来扩展它以处理缓存等。

然后,如果您愿意,您可以将您的模型分解为一个干净的“接口”(即应用程序的其余部分只知道用户的“公共”接口),并且您的工厂可以决定实例化哪个实际类,只要因为它符合用户界面。这是非常灵活的,因为您的模型细节会随着时间而变化。

于 2012-07-05T16:16:28.607 回答