gpt4 book ai didi

php - 对象设计 - PHP 和 SQL 中的用户和访问角色

转载 作者:行者123 更新时间:2023-12-04 18:51:26 24 4
gpt4 key购买 nike

你如何设计你的对象假设你有一个对象用户和一个对象access_role。用户存储在 sql 数据库的 users 表中,access_role 知道 user_id 并存储在 sql 数据库中。

    class user() {

protected $_name;
protected $_id;
protected $_age;
protected $_password;

public function getName();
public function getId();
public function getAge();
public function getPassword();

public function setName();
public function setId();
public function setAge();
public function setPassword();

//sql query
public function read(){};


}

class accessRole {

protected $_accessRole;
protected $_userId;

public function setAccessRole();
public function setUserId();
public function getAccessRole();
public function getUserId();

}

如果我想要用户的访问角色在 sql 中执行查询。但是如何连接这两个对象,以便像这样:

$u = new User();
$u->getAccessRole();

会工作吗?

最佳答案

我会通过在它们之间设置中介来分离基本用户和角色类。

$roles = $provider->roles($user);

这样 class userclass accessRole 就不必知道彼此或了解它们各自的任何属性。 class user 可以在没有访问角色的情况下愉快地生活,并且 class accessRole 未绑定(bind)到 $_userId。例如。根据一天中的时间,用户标识对于 accessRole 是什么? (好吧,愚蠢的例子。希望你明白这一点)。您甚至可以为各种子系统转换角色,而无需在整个系统中承担所有特定(子)角色。

$roles = $provider->convert($rolesBasedOnUser);

编辑:(希望)简短的例子....
我正在使用一个简单的用户类(没有进一步的接口(interface)或其他类型的抽象)并且没有角色“类”,只是一个简单的字符串数组(为简洁起见)。但请记住,您可以做更多的解耦……如果您愿意的话。

class User {
protected $id, $name;
public function __construct($id) {
$this->id = $id;
$this->name = 'user #'.$id;
}

public function getName() {
return $this->name;
}
public function getId() {
return $this->id;
}
}

interface UserRolesProvider {
public function roles(User $user);
}

现在您可以拥有依赖于用户类和 UserRolesProvider 接口(interface)的代码,但让我们更改提供者的实现而不触及所有其他代码。或者它甚至只依赖于角色集合,让您可以根据需要构建/创建/组装角色。好的,让我们有两个(虚拟的)提供者接口(interface)的实现。

class UserRolesA implements UserRolesProvider {
public function roles(User $user)
{
return 0===$user->getId()%2 ? array() : array('X');
}
}

class UserRolesB implements UserRolesProvider {
public function roles(User $user)
{
return 0!==$user->getId()%2 ? array() : array('X');
}
}

和一些用户对象

// "create" 6 users
$users = array_map( function($x) { return new User($x); }, range(1,6));

以及同时使用两者的东西

function foo($users, UserRolesProvider $provider) {
foreach($users as $u) {
$roles = $provider->roles($u);
echo $u->getName(), ' ', join(',', $roles), " | ";
}
echo "\n";
}
foo($users, new UserRolesA);
foo($users, new UserRolesB);

打印

user #1 X | user #2  | user #3 X | user #4  | user #5 X | user #6  | 
user #1 | user #2 X | user #3 | user #4 X | user #5 | user #6 X |

不是太令人印象深刻。但重点是您不必触及 User 类或函数 foo() 中的代码。
如果你愿意,解耦可以一直持续下去。
例如。一个可以回答“我这里有一些[类型]。你能给我一些从中构建角色的东西吗?”
或者甚至“你能为我构建一个 stub ,以便我可以将 fn($roles) 调用为 fn([type]) 吗?”

关于php - 对象设计 - PHP 和 SQL 中的用户和访问角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1878764/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com