从另一个类继承1方法

时间:2013-07-25 20:45:19

标签: php inheritance

我正在建立一个小型CMS /网店。我正在遵循MVC模式。

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

所以这里是: 我有两个名为“User”和“Message”的类。 “User”类有一个方法“getUsers”,它返回一个数组中的所有用户。

现在我还需要获取“Message”类中的所有用户。在我将该方法复制到“Message”类之前。但我需要更多类中的“getUsers”函数。

我正在考虑继承该类,但后来我继承了所有项目,我只想要那个方法。也许我可以创造一个拥有我需要的所有这些特殊功能的神级,然后从那个神级继承我的课程。但这看起来有点愚蠢,因为我会有一个无序的课程,每一个零碎。

那么如何使用PHP 5.3正确解决这个问题呢?

感谢您的帮助,我希望您能解决问题

4 个答案:

答案 0 :(得分:1)

根据您的描述,似乎getUsers()方法实际上并不与每个类特别相关,而是与需要获取所有用户的所有类相关。如果是这种情况,则User类中的static方法似乎是一个不错的选择。

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

然后,每当您需要所有用户时,您都可以通过拨打User::getUsers();来获取这些用户。


修改

正如评论中所提到的,这不是一个好方法,因为它引入了User类的高度依赖性。请参阅Static Methods are Death to Testabilitystatic considered harmful

答案 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
    }

}

我认为你明白了。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

class UserCollection extends ArrayObject() {

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

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