Хорошая идея - создать статический член в объекте класса и вызвать этот член для конкретной функции?

Является ли хорошей идеей создать статический член в объекте класса и вызвать этот член для конкретной функции? как:

class Users
{
     public static Login(strUsername, strPassword)
     {
          $objThis = new Users();
          ....
     }
}

и назовите это так:

Users::Login('admin', 'admin');

или второй способ:

class Users
{
     public Login(strUsername, strPassword)
     {
          //$objThis = new Users();
          ....
     }
}

и назовите это так:

$objThis = new Users();
$objThis->Login('admin','admin');

person KoolKabin    schedule 19.04.2011    source источник
comment
Если вы используете статический метод, класс не может поддерживать какое-либо состояние для пользователя.   -  person alex    schedule 19.04.2011
comment
Возможно, связано: stackoverflow.com/questions/752758/ и stackoverflow.com/questions/4685622/   -  person Frosty Z    schedule 19.04.2011


Ответы (3)


Эти функции используются, когда

  • Вы не хотите позволять создавать экземпляр класса извне класса, косвенно вы хотите сделать конструктор закрытым или защищенным.
  • Или вы хотите разрешить только один экземпляр класса для всего запроса (один запрос). За. например. Классы для базы данных, документа и т. Д.
person Gaurav    schedule 19.04.2011

Первый метод может быть полезен, если вы хотите ограничить доступ к классу и не разрешить его создание. Например:

class Users {
    private function __construct($strUsername, $strPassword) {
        // this class can now not be instantiated
        // except within itself
    }

     public static Login($strUsername, $strPassword)
     {
          return new self($strUsername, $strPassword);
     }
}

Это заставляет пользователей вашего класса всегда использовать статический метод для получения объекта User, что может быть желательно, если вы всегда хотите ограничить его использование.

Как всегда, это во многом зависит от того, чем вы хотите заниматься. static похож на инструмент, и вы используете его, когда это правильный инструмент для выполняемой работы.

person Craig Sefton    schedule 19.04.2011

Обычно следует избегать статических методов - они усложняют API и рефакторинг. Я использую статические методы только в качестве альтернативы конструкторам классов, когда инициализация может вызвать исключение (чтение из файла и т. Д.), А также для частных служебных методов.

person Alex Netkachov    schedule 19.04.2011