#php #oop #singleton
#php #ооп #синглтон
Вопрос:
ВСЕ. Вот ситуация, у меня есть страница php, которая выполняет некоторую регистрацию, вход в систему, подобные вещи, связанные с пользователем, так что давайте вызовем это user.php.
В user.php у меня есть пользовательский класс, имеющий следующие методы:
-public static function register($aEmail, $aPassword)
-public static function login($aEmail, $aPassword)
-public static function logout($aEmail, $aSessionKey)
Итак, когда пользователь войдет в систему, я сделаю что-то вроде этого:
if(isset($_POST["email"]) amp;amp; isset($_POST["password"]) amp;amp; isset($_POST["action"])){
$email = htmlspecialchars($_POST["email"]);
$password = htmlspecialchars($_POST["password"]);
if($_POST["action"] == login){
$user = new User();
//It will print the session key
$user->doLoginAndPrintTheSessionKey($email, $password);
}
Это отлично работает, но вопрос в том, должен ли я создавать пользователя как объект или только синглтон, кажется, нет смысла сохранять объект User, потому что, когда пользователь делает запрос, мне нужно использовать его электронную почту и сеансовый ключ, чтобы найти доступ к его записям…..
вот так..
public static function postAComment($aEmail, $aSessionKey, $aCommment){
BOOL $isSuccess = FALSE;
//check the session key is valid or not
if(self::isUserValidationValid($aEmail, $aSessionKey)){
//make a sql statement that write aComment to DB
//execute the sql statement
//if execute success, return isSuccess = TRUE;
}
return $isSuccess;
}
Как вы можете видеть, я могу сделать все это в одноэлементном классе, поэтому мой вопрос … …Нет ли необходимости создавать пользовательский объект в этой ситуации? Спасибо.
Ответ №1:
Вы должны создать пользовательский класс, но это не должен быть синглтон.
Наличие пользовательского объекта упростило бы ваш API. Вы бы:
register( $aPassword )
login( $aPassword )
logout( $aSessionKey )
Вместо:
register($aEmail, $aPassword)
login($aEmail, $aPassword)
logout($aEmail, $aSessionKey)
Вы передаете $aEmail через конструктор.
Ответ №2:
Применение шаблона singleton не добавляет здесь никаких преимуществ. Это редко делается на языке сценариев, таком как PHP. Вы ничего не добьетесь, добавляя дополнительную логику, необходимую для имитации синглтона (PHP в любом случае не допускает реальных).
И, наконец, могут возникнуть обстоятельства, при которых вы, возможно, захотите создать два пользовательских объекта в конце концов. Подумайте об инструменте администрирования, который позволяет сканировать дублирующиеся учетные записи пользователей. Вероятно, это не первое место в вашем списке и, вероятно, бессмысленно для большинства веб-сайтов, но вы не можете полностью исключить, что вам когда-нибудь может понадобиться использовать ваш пользовательский класс таким образом.
Особенность «одиночек» в том, что у них запоминающееся название, но не так много приложений. Просто забудьте об этом. http://sites.google.com/site/steveyegge2/singleton-considered-stupid
Но я предполагаю, что ваш главный вопрос был о простом использовании статического метода для обработки всего. И да, это имеет смысл. Если у вас на самом деле нет варианта использования для создания экземпляра пользовательского объекта, то не делайте этого. Создайте служебный метод, если это то, что вам может сойти с рук. http://en.wikipedia.org/wiki/KISS_principle