这不是一个直接的代码问题,更多的是请求指导。
我对OO PHP相当陌生,我通常是一个老派的开发人员,但我想用现代的方式做事,也许是正确的方式。
我要去三个独立的保护区。我写了一个名为Account的类,但不是创建这个类的3个实例-因为这是一个全局类,我不想在单个页面中创建它的新实例-我想有这样的东西,例如:
$account = new Account();
$account->areaOne->login();
$account->areaTwo->login();
$account->admin->login();
有几件事要指出…
- 每个实例之间的区别是Session变量。
- 每个不同的帐户信息(用户名/密码)存储在不同的表
我的问题是:
- 这是可能的吗 这背后的逻辑是什么?
- 从哪里开始比较好
- 这是做我需要的好方法吗?
很抱歉我的无知,但我甚至不知道在谷歌上搜索什么。
1。这有可能吗
是的!
2。
背后的逻辑是什么?每次执行->
时,都在访问对象的属性或函数。由此我们推断areaOne
、areaTwo
和admin
也一定是物体。所以你基本上有一个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(访问控制列表)。
尽管,正如有人在评论中建议的那样,您可能想要查看框架。虽然它们通常有一个很好的学习曲线,但它们也是真正深入了解OOP和MVC的好方法。有很多,包括: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
}
}
}
这样设计的最大好处之一是能够相互依赖地修改帐户的内部方法,而不会影响其他类中的任何功能。如果这里的目的是学习,那么我会考虑编写自己的authentication
和authorization
类,这将是很好的学习经验。最好的灵感应该来自现有的,编写良好的开源框架,如Zend Framework
。
搜索我所有突出显示的单词,这些是你想要实现的关键字。