@Banny_Boom

Правильно ли в данном случае использовать статические методы?

Делаю авторизацию
class Auth{
    public static $data;
    
    public static function attemp($login,$password){
    //Работа с бд и т.д
    }

    public static function check(){
    //проверки на кукиес и т.д
    }
    ...
}

Правильно ли в данном случае использовать статические методы?
Я очень слабо понимаю когда стоит использовать статику, а когда нет, в принципе объект тут не нужен, только проверка и все...

И правильно ли
if(Auth::check()){
}

Использовать в контроллере ?
  • Вопрос задан
  • 284 просмотра
Решения вопроса 1
27cm
@27cm
TODO: Написать статус
Сойдёт. Раз объект не нужен, то можно считать что правильно.

Я очень слабо понимаю когда стоит использовать статику, а когда нет, в принципе объект тут не нужен, только проверка и все...

Ну например, если позже вы захотите, чтобы ваш класс мог работать с разными адаптерами, а не только одной конкретной базой данных, то у объекта появится свойство, и все методы перестанут быть статическими. Аналогично может быть использовано другое хранилище вместо cookie или даже несколько. Получим что-то вроде:
class Auth
{
    protected $adapter;
    protected $storage;

    public function __construct(AdapterInterface $adapter, StorageInterface $storage)
    {
        $this->adapter = $adapter;
        $this->storage = $storage;
    }

    public function attemp($login,$password)
    {
        $this->adapter->attemp($login, $password);
    }

    public function check()
    {
        return $this->storage->check();
    }
}


ПС: Это просто пример, чтобы показать случай, когда статическими методами уже не обойтись. Я не призываю что-то менять в вашем коде.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@djay
Когда использовать статику а когда нет? Это классический вопрос.

Минусы статики:

- Нет конструктора
В конструторе обычно инициализируются все зависимости класса, без которых он не будет работать. После того, как создал экзепляр класса - конструктор выполнился. А у статичного класса нет гарантии, что класс был инициализирован. Можно конечно обойти это убогими костылями и хаками типа - StaticClass::init(), но это не правильный дизайн, по любому.

- Не сможешь писать юнит тесты аккуратно
Сейчас пока ты не знаком с этим и с теорией TDD, но в будущем ты поймешь, что глобальные статичные классы - это зло, когда попытаешься протестировать метод, внутри которого статичные классы.

Теперь по существу:

Работа с базой - создание, редактирование пользователя, а также проверка на валидность авторизации лучше всего будеть поместить в один DataMapper класс. И вообще погугли что такое Data Mapper.

class UserMapper
{
     private $pdo;
     
     public function __construct($pdo)
     {
          $this->pdo = $pdo;
     }

     public function authValid($login, $password)
     {
         // Выполнил запрос к базе через $pdo и вернул true или false
     }
}


Затем в классе Auth, в методе attemp() просто вызываешь UserMapper передавая данные, а не пишешь логику там.
Ответ написан
trevoga_su
@trevoga_su
статика не дает никаких преимуществ.
если задается такой вопрос, то скорее всего статика не нужна.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы