Php 两个交互类的面向对象设计方法
与嵌套类相比,将类链接在一起(或者更确切地说,使用一个类的结果生成另一个类)的相对优势/劣势是什么 我正在尝试重组我的用户/身份验证系统,我想知道是否Php 两个交互类的面向对象设计方法,php,design-patterns,oop,Php,Design Patterns,Oop,与嵌套类相比,将类链接在一起(或者更确切地说,使用一个类的结果生成另一个类)的相对优势/劣势是什么 我正在尝试重组我的用户/身份验证系统,我想知道是否 myAuthClass应该充当一个实用程序,如果登录成功,只需创建一个新的myUserClass对象 或者myAuthClass是否应该在内部创建myUserClass(即$this->user=new myUserClass) 或者,即使myUserClass应该在必要时调用myAuthClass(即当用户尝试登录时),并根据需要更新其内部结
- myAuthClass应该充当一个实用程序,如果登录成功,只需创建一个新的myUserClass对象
- 或者myAuthClass是否应该在内部创建myUserClass(即$this->user=new myUserClass)
- 或者,即使myUserClass应该在必要时调用myAuthClass(即当用户尝试登录时),并根据需要更新其内部结构(新电子邮件、收藏夹、购物车等)
干杯。从学术角度来看,所有3个选项都是不正确的,因为它们是针对具体实现而不是抽象接口编程的。因此,它们直接耦合在一起,这就限制了重用—您可以同时重用它们或根本不重用它们 您可以生成IUserClass或IAuthClass并将此抽象接口实现为一个具体的类,然后我将考虑这样一种情况:身份验证类实现在进行身份验证时使用IUserClass进行填充,或者用户类获得了IAuthClass的实现进行身份验证 在每个场景中,这都允许最大的灵活性,因为auth类可以重用,可以生成不同版本的UserClass,或者user类可以使用多种不同的身份验证机制,只要从IAuthClass继承 后一种给用户类一个身份验证对象(实现IAuthClass)的方法是我的首选,因为身份验证机制不同,即使是在单个应用程序中,而用户类变化较小。但为了正确起见,两者都不应以具体实施为基础
但是,这可以被视为是过度的,因此这是一个判断性的调用。首先,我建议您使用适配器模式。您应该有一个定义接口(公共方法)的抽象类,而不是创建一个实现特定类型身份验证的类。例如,您可以创建一个用于DB基本身份验证的类/适配器,一个用于LADP身份验证。。等等 最好的办法不是重新发明轮子,而是使用现成的解决方案。我使用了Zend_Auth,它实现了适配器模式。通过使用Zend_Auth,如果愿意,您可以了解良好的OOP实践、适配器模式、接口和抽象类的使用 在这里,您可以看到我如何使用Zend_Auth作为内部网
protected function Authentication() {
$strEmail = trim($this->txtEmail->Text);
$this->txtPassword->Text = trim($this->txtPassword->Text);
// do the process of authentication, AD and then DB
// Get a reference to the singleton instance of QAuth
$auth = QAuth::getInstance();
// Set up the authentication adapter
$authAdapter = new QAuth_Adapter_WebService(__LOGIN_WS_URL__,
$strEmail, $this->txtPassword->Text
);
// Attempt authentication, saving the result
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
$objUser = User::LoadByEmail($strEmail);
// if there is not a user's record create one
if(!$objUser) {
$this->User_Create($strEmail);
$objUser = User::LoadByEmail($strEmail);
}
$crypt = new Encryption();
$encr = $crypt->encrypt(__KEY__, $objUser->UserID);
$_SESSION['user_id'] = $encr;
setcookie('user_id', $_SESSION['user_id'], time()+(3600*24*365*20));
$this->Intranet1Integration($objUser->UserID);
QApplication::Redirect('http://'.__URL__.'/index.php');
}
else {
QApplication::DisplayAlert(
'Log on failed. You must provide a Company email and a correct password.'
);
}
}
链接类的主要优点是使它们彼此独立,因此修改一个类对另一个类绝对没有(或很少)影响。例如,假设要更改身份验证方法,则不需要更改用户,反之亦然
这两种方法都有其他小的优点,但这种可维护性是适配器模式和Zend参考的主要优点;它的文档将提供非常有用的案例研究。非常好的观点,并且与我的特定项目最相关,因为未来的开发可能会包括一个OpenID风格的认证系统。如果没有外部依赖,那么针对具体实现进行编程是没有错的。也就是说,如果类只在同一个包中使用——包是高度内聚的——没有接口没有错。