@Banny_Boom

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

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

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

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

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

Использовать в контроллере ?
  • Вопрос задан
  • 286 просмотров
Решения вопроса 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
статика не дает никаких преимуществ.
если задается такой вопрос, то скорее всего статика не нужна.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы