1

这不是直接的代码问题,而是更多的指导请求。

我对 OO PHP 相当陌生,我通常是一个老派开发人员,但我想以现代方式做事,也许是正确的方式。

我要去 3 个单独的保护区。我编写了一个名为 Account 的类,但没有创建该类的 3 个实例——因为这是一个全局类,我不想在单个页面中创建它的新实例——我想要这样的东西例子:

$account = new Account();
$account->areaOne->login();
$account->areaTwo->login();
$account->admin->login();

有几点需要指出...

  • 每个实例之间的区别在于 Session 变量。
  • 每个不同的帐户信息(用户名/密码)都存储在不同的表中

所以这是我的问题:

  1. 这甚至可能吗
  2. 这背后的逻辑是什么
  3. 从哪里开始是个好地方
  4. 这甚至是做我需要的好方法吗?

对不起我的菜鸟,但我什至不知道在谷歌上搜索什么。

4

3 回答 3

2

1. 这可能吗

是的!

2. 这背后的逻辑是什么

每次你都->在访问一个对象的属性或函数。鉴于此,我们推断areaOne,areaTwoadmin必须是对象。所以你基本上有一个Account类来创建Login具有login()函数的对象。

3. 从哪里开始是个好地方

只需阅读有关 OOP 的更多信息,然后尤其是 PHP

因此,您了解示例背后的概念,示例实现的结构如下。

(此示例旨在反映 OP 的示例,不应被视为好或坏!)

class Account
{
  public $areaOne, $areaTwo, $admin;
  public function __construct()
  {
    $this->areaOne = new Login();
    $this->areaTwo= new Login();
    $this->admin= new Login();
  }
}

class Login
{
  //Maybe receive some parameter here...
  public function __construct(){}

  public function login()
  {
    //Login logic
  }
}

4.这甚至是做我需要的好方法吗?

嗯......这总是主观的。我需要更多地了解您正在开发的应用程序才能确定。这取决于项目的复杂程度、您使用的模式等。但是,是的,我认为您应该改进这个想法。请参阅问题 #3 以了解如何做到这一点,因为这不是我可以用简单的答案教你如何做的事情:)

一些问题要问自己:

  • 这些类中的每一个有什么用?我真的需要这一切吗?
  • 区域数量会改变吗?如果他们改变了我能做些什么来让代码在不改变的情况下支持它?(也许使用工厂模式?)
于 2013-06-06T22:02:19.657 回答
1

在不同的类中拥有多个authentication方法将是代码重复,这意味着调试和维护的噩梦。如果您还选择将用户信息保存在数据库中的单独表中,那只会使问题更加复杂。请记住,他们都是用户,只是使用不同的permissions.

如果是我,我会encapsulate全部归authentication为一个类并将帐户实例传递给login方法。

class Authentication {
  public function login(Account $account, $password) {
    if ($this->isValidPassword($account, $password)) {
     // Login successful
    }
  }
} 

例如,当他们访问 aresource时,Area1他们是authorized

class Authorisation {
  public function authorise($account, $resource) {
    $role = $this->account->getRole();
    if ($this->isAllowedAccess($role, $resource)) {
     // Grant access
    }
  }
}

像这样的设计的一大好处是能够相互依赖地修改帐户的内部方法,而不会影响其他类中的任何功能。

如果这里的目的是学习,那么我会考虑编写自己的课程authenticationauthorization课程,这将是很好的学习体验。最好的灵感应该来自现有的、编写良好的开源框架,例如Zend Framework.

也搜索我所有突出显示的单词,这些是您要达到的目标的关键字。

于 2013-06-06T22:44:22.027 回答
1

所有你需要的是

$account = new Account();
$account->login();

您的帐户对象应该包含必要的字段,以了解它是管理员还是什么。如果您需要更细粒度的访问,您可能需要查看ACL(访问控制列表)。

尽管正如评论中有人建议的那样,您可能希望查看框架。虽然它们通常具有很好的学习曲线,但它们也是真正深入了解OOPMVC的好方法。有很多,包括:Symfony2、Zend、Laravel 和 CodeIgniter。我对 Symfony 有偏见,但这取决于你问谁以及你想要完成什么。

当然,他们做了很多肮脏的工作,但即使使用框架也有很多东西要学习。

于 2013-06-06T22:07:37.910 回答