2013-07-25 84 views
1

我正在做一个小CMS /网上商店。我遵循MVC模式。从其他类继承1方法

我被困在以前遇到的问题,但我认为解决了错误。

所以这里是: 我有两个类叫做“用户”和“消息”。 “User”类具有返回数组中所有用户的方法“getUsers”。

现在我还需要在“消息”类中获取所有用户。在我将这个方法复制到“消息”类之前。但是我会在更多的类中使用这个“getUsers”函数。

我在想继承这个类,但后来我继承了所有的项目,我只想要那个方法。也许我可以创建一个具有我需要的所有这些特殊功能的上帝课程,然后从这个上帝课程继承我的课程。但是,这似乎有点愚蠢,因为我将有一个无序的班级与每一个零碎。

那么如何正确解决这个问题与PHP 5.3?

感谢您的帮助,我希望根据你描述它似乎像getUsers()方法实际上是不相关的,特别每个类,而是需要得到所有所有类你可以解决问题

+0

你是什么意思让所有的用户在消息类中?这听起来像一个消息用户系统? – null

+0

我需要获取所有用户名才能向用户发送消息。它无关紧要。其他类的问题相同 – Sharpless512

回答

1

用户。如果是这种情况,User类中的static方法似乎是一个不错的选择。

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

然后每次你需要的所有用户,您可以通过调用User::getUsers();得到它们。


编辑

正如评论,这不是一个好办法提到,因为它引入了于User类高dependecy。见Static Methods are Death to Testabilitystatic considered harmful

+1

这会将需要该方法的所有类紧密耦合到User类,从而妨碍代码的重用和可变性。它也将使测试纯粹的痛苦,因为你不能嘲笑用户类。这里没有理由使用静态方法。请参阅http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability和http://kore-nordmann.de/blog/0103_static_considered_harmful.html – Gordon

+1

我明白你的观点,我同意。谢谢。 –

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 
    } 

} 

的阵列我想你明白了吧。

+1

谢谢@ Gordon ..我会投票,如果它不是我自己的帖子;) – bitWorking

1

您可以在Message类中创建Users类的实例,然后调用getUsers方法。 也许更好的方法是将该实例作为参数传递给构造函数或Message类的方法。或者您可以将该用户数组作为参数传递。我不知道你的课程是如何设计的,但它应该以这种方式工作。 我建议从现有的用户类和代码中提取一个接口,以避免类的紧耦合

0

我会建议创建一个基于ArrayObject的简单集合类。

class UserCollection extends ArrayObject() { 

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

$users = new UserCollection(); 
$users->load($criterion); 
+0

如果它可以加载,大概来自数据源,它更像是一个存储库而不仅仅是收集。此外,当它包含对象时,请考虑通过ArrayObject的SplObjectStorage。 – Gordon

+0

关于SplObjectStorage的好主意,但是我们没有得到关于这个项目中类结构的很多信息。:)所以我想也许他现在可以为用户使用简单的数组。 –

+0

是的。但我的主要观点是,无论如何,你的Collection看起来像一个Repository;)我不确定它是否回答OP如何在“其他”类中提供该问题的问题。 – Gordon