Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于处理基于权限的函数的抽象类_Php_Permissions_Polymorphism_Abstract - Fatal编程技术网

Php 用于处理基于权限的函数的抽象类

Php 用于处理基于权限的函数的抽象类,php,permissions,polymorphism,abstract,Php,Permissions,Polymorphism,Abstract,我构建了一个抽象的用户类,它由Admin、Manager和Employee扩展。用户包含所有用户需要的所有内容,并根据实例使用不同的逻辑抽象每个用户处理的所有内容。当我有一个Admin或Manager类将以完全相同的方式处理的功能时,我的困惑就出现了,但员工将根本无法访问这些功能 例如,管理用户而不是管理用户本身应该只限于管理员和经理,而员工永远不能这样做。我想避免复制/粘贴Admin和Manager类中完全相同的逻辑,所以我应该创建一个单独的私有函数并将其移到User类,并让Admin/Man

我构建了一个抽象的用户类,它由Admin、Manager和Employee扩展。用户包含所有用户需要的所有内容,并根据实例使用不同的逻辑抽象每个用户处理的所有内容。当我有一个Admin或Manager类将以完全相同的方式处理的功能时,我的困惑就出现了,但员工将根本无法访问这些功能

例如,管理用户而不是管理用户本身应该只限于管理员和经理,而员工永远不能这样做。我想避免复制/粘贴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";
    }
....
}

这应该以不同的方式处理吗?谢谢。

您可以通过检查将逻辑移动到用户基类中,以确保指定的用户是经理或管理员,但您可以在以后添加不同的“类”用户,这些用户可能需要相同的功能,在这种情况下,您编写的代码需要更新


我的建议是在Manager/Admin用户和User抽象类之间创建一个新的抽象类,可能类似于
UserEditor
UserEditor
扩展用户并为管理员/管理员提供更新其他用户的功能,管理员/管理员从UserEditor而不是您的用户类进行扩展。

您可以通过检查将逻辑移到用户基类中,以确保指定的用户是管理员或管理员,但是您可以在以后添加不同的“类”用户,这些用户可能需要相同的功能,在这种情况下,您编写的代码将需要更新


我的建议是在Manager/Admin用户和User抽象类之间创建一个新的抽象类,可能类似于
UserEditor
UserEditor
扩展用户并为管理员/经理提供更新其他用户的功能,管理员/经理从UserEditor而不是您的用户类进行扩展。

如果您这样做,我认为您应该有一个
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
        }
    }

}

如果您这样做,我认为您应该有一个
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
        }
    }

}

我确实在我用于页面权限的站点中内置了ACL,所以这不会是一个问题。当然,我更喜欢使用实例来指示是否可以执行操作。你还会推荐使用watcher的解决方案进行ACL检查吗?我确实在网站中内置了ACL,我使用它来获得页面权限,所以这不会是一个问题。当然,我更喜欢使用实例来指示是否可以执行操作。您仍然建议使用watcher的解决方案进行ACL检查吗?