OO PHP多个'方法'


OO PHP multiple 'methods'?

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

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

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

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

有几件事要指出…

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

我的问题是:

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

很抱歉我的无知,但我甚至不知道在谷歌上搜索什么。

1。这有可能吗

是的!

2。

背后的逻辑是什么?

每次执行->时,都在访问对象的属性或函数。由此我们推断areaOneareaTwoadmin也一定是物体。所以你基本上有一个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了解如何做到这一点,因为这不是我可以在一个简单的答案中教如何做的事情:)

问自己几个问题:

  • 这些类的用途是什么?我真的需要这些吗?
  • 区域的数量会改变吗?如果它们改变了,我怎么做才能使代码在不改变的情况下支持它?(也许使用工厂模式?)

你所需要的是

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

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

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

当然,它们做了很多不干净的工作,但是即使在使用框架时,也有很多要学习。

在不同的类中拥有多个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

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