我正在建立一个小型CMS /网店。我正在遵循MVC模式。
我遇到了以前遇到过的问题,但我认为解决了错误。
所以这里是: 我有两个名为“User”和“Message”的类。 “User”类有一个方法“getUsers”,它返回一个数组中的所有用户。
现在我还需要获取“Message”类中的所有用户。在我将该方法复制到“Message”类之前。但我需要更多类中的“getUsers”函数。
我正在考虑继承该类,但后来我继承了所有项目,我只想要那个方法。也许我可以创造一个拥有我需要的所有这些特殊功能的神级,然后从那个神级继承我的课程。但这看起来有点愚蠢,因为我会有一个无序的课程,每一个零碎。
那么如何使用PHP 5.3正确解决这个问题呢?
感谢您的帮助,我希望您能解决问题
答案 0 :(得分:1)
根据您的描述,似乎getUsers()
方法实际上并不与每个类特别相关,而是与需要获取所有用户的所有类相关。如果是这种情况,则User
类中的static
方法似乎是一个不错的选择。
class User {
public static function getUsers() {
// ...
}
}
然后,每当您需要所有用户时,您都可以通过拨打User::getUsers();
来获取这些用户。
修改强>
正如评论中所提到的,这不是一个好方法,因为它引入了User
类的高度依赖性。请参阅Static Methods are Death to Testability和static
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);