1

我已经根据我在网上找到的其他所谓的高质量、安全的类编写了一个用户类(尽管混合了其中的一些,从我所学到的,实际上没有一个是那么安全的)。问题是,在我初始化不同对象的脚本中,$User 对象的片段太长了。其他对象只需要$Browser = new Browser();$_ = new Translate ($DB, $User->get('Language'));。所以,突然把所有这些代码放在这里感觉有点难看:

  /* USER. Handles user data and login/logout/register. */
  $User=new User($DB, Configuration::get('SiteKey'));
  if (isset($_POST['logout']))
    $User->logout();
  else if (isset($_POST['login']) && !$User->login($_POST['email'], $_POST['password']))  // If user tries to login
    $Error->set ('Banner', 'Username or password incorrect. Please try again.');
  else if (isset($_SESSION['email']) && isset($_SESSION['session']))
    $User->loginSession ($_SESSION['email'], $_SESSION['session']);
  else if (isset($_POST['register']))
    $User->add ($_POST);

  /* Language */
  if (!empty ($_POST['lang']) && in_array($_POST['lang'],Configuration::get('SupportedLanguages')))
    {
    $User->set('language', $_POST['lang']);
    $_SESSION['language'] = $_POST['lang'];
    }
  if (!$User->get('language'))
    $User->set('language', Configuration::get('DefaultLanguage'));

我不确定所有这些代码应该在哪里,我应该把它放在用户的类__constructor()中还是应该像现在这样放在外面?

传递 $_POST 比直接在内部使用它更好,这可能会影响答案(传递了太多变量的 __constructor() 也不是很好)。

我不认为类中的代码如此相关以至于将其附加到此处,但是如果您想查看它,我只是将其公开在我的 github中。

4

1 回答 1

1

我不确定所有这些代码应该在哪里,我应该把它放在用户的类 __constructor() 中还是应该像现在这样放在外面?

我不会把它放在构造函数中。无论您在其中拥有此代码的任何脚本或类,看起来都需要履行许多职责。您可以考虑遵循单一职责原则,并将此代码分离到其他类中,例如身份验证类、会话类和可以构建用户对象的用户工厂。一个简短且绝不是精心构建的示例:

class User
{

}

class Session
{

}

class UserFactory
{
  public function create($vars, ...)
  {
  //build user...
  return $user;
  }
}

class Authenticate
{
  public function __construct($userFactory)
  {
    //...
  }

  public function Login($username, $passwd)
  {
    //do stuff...
    return $userFactory->create($vars, ...);
  }

  public function AuthenticateSession($session)
  {
    //...
   return $userFactory->create($vars, ...);
  }
}

传递了太多变量的 __constructor() 也不是很好

好吧,您总是可以将变量分组到一个集合对象中并将其传递给构造函数。例如,可以将语言和时间设置分组到一个文化对象中。

于 2013-01-18T05:32:07.420 回答