1

我正在制作一个小 CMS / 网上商店。我正在遵循 MVC 模式。

我遇到了一个我以前遇到过的问题,但我认为解决了错误。

所以这里是:我有两个类,分别称为“用户”和“消息”。“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 类的方法。或者您可以将该用户数组作为参数传递。我不知道您的课程是如何设计的,但它应该以这种方式工作。我建议从现有的 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 回答