我构建了一个抽象的User类,由Admin,Manager和Employee扩展。用户包含所有用户将需要的所有内容,并使用基于实例的不同逻辑抽象每个用户处理的所有内容。当我具有Admin或Manager类将以完全相同的方式处理的功能时,我的困惑就出现了,但是Employee将根本无法访问。
例如,管理除自身以外的用户应仅限于管理员和经理,而员工应该永远不能这样做。我想避免在Admin和Manager类中复制/粘贴完全相同的逻辑,所以我应该创建一个私有函数并将其移动到User类,只需要让Admin / Manager类从那里调用它?
abstract class User
{
public $username;
public $userId;
public $company;
public $error;
private function updateUser($user)
{
// Logic for saving the user info
}
....
}
class Admin extends User
{
public function updateUser($user)
{
parent::updateUser($user)
}
....
}
class Manager extends User
{
public function updateUser($user)
{
parent::updateUser($user)
}
....
}
class Employee extends User
{
public function updateUser($user)
{
$this->error = "Invalid Permissions";
}
....
}
这应该以不同方式处理吗?感谢。
答案 0 :(得分:1)
您可以将逻辑移动到用户基类中,并检查以确保指定的用户是管理员或管理员,但您可以在以后添加不同的“类”用户,这可能需要相同的功能,在这种情况下,您编写的代码将需要更新。
我的建议是一个新的抽象类,位于Manager / Admin用户和User抽象类之间,可能类似于UserEditor
。 UserEditor
扩展了用户并为管理员/管理员提供了更新其他用户的功能,管理员/管理员从UserEditor扩展而不是用户类。
答案 1 :(得分:0)
如果你这样做,我认为你应该有一个ACL
类,并在函数中执行检查,这样你就不需要覆盖任何东西
abstract class User
{
public $username;
public $userId;
public $company;
public $error;
private final function updateUser($user)
{
if(ACL::checkIfUserHasPermissionToUpdateUser($this->userId){
//Perform the update, this code will be executed only if the user
//is a Manager or an Admin, but the logic is delegated to the ACL class
}
}
}