@topuserman

Является ли это исключительной ситуацией?

Например есть класс, который в конструктор получает некоторые входные данные, которые необходимы для инициализации объекта.

Например:

class User {
    private ?array $userData;

    public function __construct(int $userId) {
        $this->userData = ...;
        // ...
    }

    // ...

    public function getId(): int {
        return $this->userData["ID"];
    }

    public function getFullName(): string {
        return implode( " ",
            clearArray( [
                    $this->userData["NAME1"],
                    $this->userData["NAME2"],
                    $this->userData["NAME3"]
            ] )
        );
    }

    public function getLogin(): string {
        return $this->userData["LOGIN"];
    }

    public function getEmail(): string {
        return $this->userData["EMAIL"];
    }
}


Что делать, в случаях, когда по входным данным невозможно инициализировать объект ? Например, по заданному Id не удалось найти пользователя ? Выбрасывать исключение ? или создать доп. метод isExist(): bool ?

Я склонен к первому варианту, т.к. во втором случае, нужно будет, каждый раз, перед использование методов класса, писать проверку if($user->isExist()) ..

Как принято решать подобные задачи ?
  • Вопрос задан
  • 220 просмотров
Решения вопроса 2
maksim92
@maksim92 Куратор тега PHP
Нашёл решение — пометь вопрос ответом!
В сущность должны передаваться конкретные параметры: $id, $login, а не массив $userData, из которого потребуется извлекать эти данные, проверять их тип и существование. При таком подходе вы можете использовать типизацию и будете уверены в переданных данных.

Вы так же можете создавать сущность разными фабричными методами.

Исключение должно быть в методе get() вашего репозитория. И не путайте методы find() и get():

  • find() — возвращает сущность или null.
  • get() — возвращает сущность или исключение.
Ответ написан
trapwalker
@trapwalker
Программист, энтузиаст
А БД у вас глобально торчит в виде синглтона? Вы даёте id конструктору пользователя, и этот конструктор сам (!) лезет в БД (какую-то), что-то оттуда подтягивает, бросает исключения в зависимости от внешнего состояния...

У какой-то другой сущности, к примеру у приложения, должен быть фабричный метод get_user. Он по идентификатору достаёт необходимые данные (этот код можно в классовый метод юзера поместить) и создаёт на основе этих данных инстанс юзера, например передавая все основные данные в конструктор.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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