在__construct()或外部工作的地方?

时间:2013-01-18 02:04:20

标签: php constructor initialization

我根据我在网上发现的其他所谓的高质量,安全的类写了一个用户类(尽管从我学到的东西中混合了其中的一些,实际上没有一个是安全的)。问题是,在我的脚本中初始化不同的对象,我有一个太长的$ 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()中,还是这应该是现在的外部?

better to pass the $_POST比直接在里面使用它可能影响答案(传递过多变量的__constructor()也不是很好。)

我不认为课程中的代码与此处的相关性如此相关,但如果你想看到它我只是在my github公开发布。

1 个答案:

答案 0 :(得分:1)

  

我不确定所有这些代码应该在哪里,我应该这样做   在User的类__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()也不是真的   好

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