1

CMS / ウェブショップを少し作っています。私はMVCパターンに従っています。

以前に直面した問題で立ち往生していますが、間違って解決したと思います。

「User」と「Message」という 2 つのクラスがあります。クラス「User」には、配列内のすべてのユーザーを返すメソッド「getUsers」があります。

ここで、「メッセージ」クラスのすべてのユーザーも取得する必要があります。メソッドを「メッセージ」クラスに複製する前に。しかし、より多くのクラスでこの「getUsers」関数が必要になります。

クラスを継承することを考えていましたが、すべてのアイテムを継承し、そのメソッドのみが必要です。必要なすべての特別な機能を備えた神のクラスを作成し、その神のクラスからクラスを継承することができるかもしれません。しかし、それは少しばかげているように思えます。

では、PHP 5.3 でこの問題を正しく解決するにはどうすればよいでしょうか?

助けてくれてありがとう、私はあなたが問題を解決できることを願っています

4

4 に答える 4

1

あなたの説明に基づいて、getUsers()メソッドは実際には特に各クラスに関連しているのではなく、すべてのユーザーを取得する必要があるすべてのクラスに関連しているように見えます。この場合、クラスstatic内のメソッドは適切な選択のようです。User

class User {
    public static function getUsers() {
        // ...
    }
}

その後、すべてのユーザーが必要になるたびに、 を呼び出して取得できますUser::getUsers();


編集

Userコメントで述べたように、これはクラスへの依存度が高くなるため、良いアプローチではありません。静的メソッドはテスト容易性を損ない、static有害と見なされる を参照してください。

于 2013-07-25T20:55:00.520 に答える
1

したがって、Messageクラスはクラスに依存しますUser。それを解決する最善の方法は、依存性注入を使用することです。

$user = new User();
$message = new Message($user);

class Message 
{
    protected $_user;

    public function __construct(User $user) 
    {
        $this->_user = $user;
    }

    public function methodThatNeedsUser() 
    {
        $userList = $this->_user->getUsers();
        ...
    }

}

または、結合のない代替手段として、ユーザーの配列を渡すだけです

$user = new User();
$message = new Message();
$message->methodThatNeedsUser($user->getUsers());

class Message 
{
    public function methodThatNeedsUser(array $userList) 
    {
        // do something with $userList
    }

}

要点がわかると思います。

于 2013-07-25T20:55:44.617 に答える
1

Message クラスで Users クラスのインスタンスを作成し、後で getUsers メソッドを呼び出すことができます。おそらく、そのインスタンスをパラメーターとしてコンストラクターまたは Message クラスのメソッドに渡す方がよいでしょう。または、その User 配列を引数として渡すこともできます。クラスがどのように設計されているかはわかりませんが、そのように機能するはずです。クラスの密結合を避けるために、既存の Users クラスとそれに対するコードからインターフェイスを抽出することをお勧めします

于 2013-07-25T20:59:17.010 に答える
0

ArrayObject に基づいて単純なコレクション クラスを作成することを提案します。

class UserCollection extends ArrayObject() {

    public function load($criterion) {
        //loop with $this->append($user);
    }
}

$users = new UserCollection();
$users->load($criterion);
于 2013-07-25T21:03:39.940 に答える