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(即当用户尝试登录时),并根据需要更新其内部结构(新电子邮件、收藏夹、购物车等)
正如你所看到的,我有点像一个OOP n00b。具体地说,我似乎能够为每种方法提供一个案例,因此我很有兴趣听取其他人关于各种方法的+ve/-ve的意见


干杯。

从学术角度来看,所有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风格的认证系统。如果没有外部依赖,那么针对具体实现进行编程是没有错的。也就是说,如果类只在同一个包中使用——包是高度内聚的——没有接口没有错。