OO PHP多个'方法'?

时间:2013-06-06 21:43:08

标签: php oop

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

我是OO PHP的新手,我通常是一名老式开发人员,但我想以现代的方式做事,也许是正确的方式。

我要去3个独立的保护区。我写了一个名为Account的类,但不是创建这个类的3个实例 - 因为这是一个全局类,我不想在单个页面内创建它的新实例 - 我希望有像这样的东西:

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

很少有事情要指出......

  • 每个实例之间的差异是会话变量。
  • 每个不同的帐户信息(用户名/密码)都存储在不同的表格中

所以这是我的问题:

  1. 这是否可能
  2. 这个
  3. 背后的逻辑是什么
  4. 哪里是一个好的起点
  5. 这是否是做我需要的好方法?
  6. 对不起我的高傲,但我甚至不知道在Google上搜索什么。

3 个答案:

答案 0 :(得分:2)

<强> 1。这是否可能

是!

<强> 2。这个

背后的逻辑是什么

每次执行->时,您都在访问对象的属性或功能。鉴于此,我们推断areaOneareaTwoadmin也必须是对象。所以你基本上有一个Account类来创建Login个具有login()功能的对象。

第3。哪里是一个好的起点

请阅读有关OOP的更多信息,然后阅读PHP in particular

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

(此示例旨在反映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以了解如何做到这一点,因为这不是我可以在一个简单的答案中教导如何做的事情:)

要问自己一些问题:

  • 这些课程的用途是什么?我真的需要这一切吗?
  • 区域数量会改变吗?如果他们改变我可以做什么来使代码支持它而不做任何改变? (也许使用factory pattern?)

答案 1 :(得分:1)

你需要的只是

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

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

虽然正如评论中建议的那样,您可能希望查看框架。虽然他们通常有很好的学习曲线,但他们也是真正深入 OOP MVC 的好方法。有很多,包括:Symfony2,Zend,Laravel和CodeIgniter。我偏向于Symfony,但这取决于你提出的问题以及你想要完成的事情。

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

答案 2 :(得分:1)

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

如果是我,我会encapsulate将所有authentication分成一个班级,并将帐户实例传入login方法。

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

当他们访问resource时,说Area1,然后authorized

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

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

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

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