我根据我在网上发现的其他所谓的高质量,安全的类写了一个用户类(尽管从我学到的东西中混合了其中的一些,实际上没有一个是安全的)。问题是,在我的脚本中初始化不同的对象,我有一个太长的$ 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公开发布。
答案 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()也不是真的 好
您总是可以将变量分组到集合对象中并在构造函数中传递它。例如,可以将语言和时间设置分组到文化对象中。