Как грамотно обрабатывать ошибки в конструкторах? PHP

Допустим есть класс, который в конструкторе принимает массив и что-то делает с его элементами. Предположим, что элементы должны соответствовать какому-либо условию. Как правильно обработать случай, когда элемент не соответствует? Пользователь же должен как-то узнать об ошибке?

До этого изучал С++ и оттуда знаю, что бросать исключения в конструкторе - очень плохая идея. Относится ли это к PHP, а если да, то как уведомлять пользователей об ошибках в конструкторе?


Ответы (1 шт):

Автор решения: BigTows

Аналогичный пример вашей проблемы

Предположим что у нас есть класс DataBaseConnection и для его работы нам необходим класс DataBaseConfiguration.

DataBaseConfiguration - используем для хранения настроек:

class DataBaseConfiguration{
    private $url;
    
    private $userName;
    
    private $password;
    //Другие поля и Setterы и Getterы
}

DataBaseConnection - компонент системы, который инициализирует соединение с базой данных

class DataBaseConnection
{

    /**
     * Создание компонента для работы с БД
     *
     * @param DataBaseConfiguration $configuration
     *
     * @throws Exception\DataBaseConnectionException
     */
    public function __construct(DataBaseConfiguration $configuration)
    {
        $this->initializeConnection($configuration);
    }

    /**
     * @param DataBaseConfiguration $configuration
     *
     * @throws Exception\DataBaseConnectionException
     */
    private function initializeConnection(DataBaseConfiguration $configuration)
    {
        try {
            //Как-то создаем подключение
        } catch (PDOException $e) {
            throw new Exception\DataBaseConnectionException("Can't initialize connection {$e->getMessage()}");
        }
    }
}

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

Добавления Exception в конструктор класса, вы выдаете контракт использования пользователю данного компонента, на то что класс:

  • Либо создается и работает корректно
  • Либо не создается вообще и бросается Exception

Ваша проблема

Так и с вашим классом, нет смысла в компоненте, который не работает :)

Создавая Exception:

  • Вы спасаете себя от дальнейших проблем
  • Создаете контракт использования
  • Даете пользователю компонента контроль над происходящим.

Дополнения

  • Используйте PHPDoc's с аннотацией @throws
  • Возможно вашему "массиву" необходима структура данных, но не факт :)
→ Ссылка