Нужно ли создавать объект в этой ситуации?

#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