简洁:如何避免在模型中使用静态方法?
Loquacious:假设我有一个用户类别。有了 userID,我可以通过 (new user($userID))->getUserName()
获取用户名。好吧,如果我想查找用户怎么办? (new user())->lookup($uname, $pass)
。仍然可以,但后一种情况可以通过一个简单的静态方法user::lookup($uname, $pass)
来完成!
一些想法:
- 没关系!随时使用
(new object())->method()
。那么我应该创建一个空心对象来调用函数吗? - 将此函数移出您的模型。如果需要数据库查找,哪里比模型上下文更好?
- 将其定义为静态方法。那么在类中混合使用公共(public)方法和静态方法不是很糟糕吗?
旁注:我搜索过这个问题,没有结果!
最佳答案
将此函数移出您的模型。如果需要数据库查找,哪里比模型上下文更好?
是的,确实,这是解决问题的最好方法。
目前,您的 User
类违反了单一责任原则,该原则基本上表示“一个任务 - 一个类”。
现在,您的用户
描述了用户实体/状态并处理持久性(在您的情况下 - 从数据库检索)。看,有两件事。
我建议您创建另一个类来处理持久性任务,例如添加/更新/删除用户。最简单的解决方案是创建一个原始存储库,如下所示:
<?php
class UserRepository
{
public function addUser(User $user);
public function updateUser(User $user);
public function deleteUser(User $user);
public function getUserById($id);
}
然后可以通过以下方式检索用户:
// get an instance of this repository class
$userRepository = new UserRepository;
// ask it to find and return user from the database by ID
$user = $userRepository->getUserById($_GET['id']);
易于阅读,易于操作,对吗?
这个UserRepository
类实际上是Repository Pattern的原始实现。 UserRepository
模拟所有用户的内存集合,将实现隐藏在内部。它对您作为用户隐藏了实际的持久性机制:想象一下,您的同事会编写这个类,而您只是使用它的方法,例如 UserRepository::getById(1)
-你甚至不知道/关心它是否从文件/数据库/API 中获取数据。那很整齐。 )
Kristopher Wilson 的《The Clean Architecture in PHP》一书非常清楚地描述了这个特定的实现,我强烈推荐您阅读这本书:它将花费您两到三个晚上的时间,并将您推向一个新的水平。
你可以扩展方法列表,当然,添加查找等。
class UserRepository
{
public function getByCompany(Company $company);
public function getByEmail($email);
public function countTotal();
}
事实上,每次您需要在数据库中获取/添加/更新用户时,您都应该通过此存储库来完成。
我想强调,这是该模式的一个简单实现,特别是如果您将它与 Martin Fowler describes as Repository 进行比较。 。不过,在大多数情况下,这是完全没问题的。
关于php - MVC : Having static method in models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39923318/