2

Say i have the following data:

// Users Table

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

and the following class:

// Users.php

class Users {

    public $first;
    public $last;

    ...

}

I need to instantiate User objects from query results and return an array of objects. I don't know which is the better way to do this:

Static Method

Encapsulate in the class file the following pseudo-code:

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

and call it like this:

$allUsers = Users::getAll();

Regular ol' Function

Works like the static method, but maybe i could refactor to work with other objects as well...

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

WHICH IS THE BETTER WAY?

I like encapsulating it in a class function, but handling static database connection objects is more pain. I like simple "helper" function, but that just throws OOP to the wind alltogether. What do i do?

***Update: This is not a MySQLi or PDO thing. I'm asking (just from an OOP best practice vantage) is it better to put a static 'getAllOfMyself()' method in classes or better to have simple functions like 'getAllSomethings()'.

4

1 に答える 1

1

私の意見では、ファクトリ パターンとシングルトンを組み合わせる必要があります (いずれにせよ、ファクトリでは一般的です)。静的メソッドの提案は本質的にファクトリですが、その方向にさらに分解することができます/すべきです。getUserByID() や getAllActiveUsers() などのメソッドを使用して、UserFactory のようなクラスを作成します。これらは静的メソッドにすることができます (静的メソッドにする必要があります)。ただし、これをシングルトンにすることはできます。これらの各メソッドは、インスタンスで同様の名前のプライベート メソッドを呼び出すことができます (_getUserByID()、_getAllActiveUsers())。インスタンスは DB 接続を管理でき、将来的にはそれを拡張してキャッシュなどを処理することもできます。

次に、必要に応じて、モデルをクリーンな「インターフェース」に分解できます (つまり、アプリケーションの残りの部分は、ユーザーの「パブリック」インターフェースについてのみ認識します)。ファクトリは、インスタンス化する実際のクラスを決定できます。ユーザーインターフェースに準拠しているため。モデルの詳細は時間の経過とともに変化するため、これは非常に柔軟です。

于 2012-07-05T16:16:28.607 に答える