при реализации интерфейса или расширении абстрактного класса следует ссылаться на абстрактный / интерфейс или имплиментацию? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть абстрактный класс, который содержит методы моей базы данных: abstractDatabase

Я расширяю этот класс с помощью: Database

При ссылке на это в другом классе, я должен использовать abstractDatabase или Database?

class Config
{
    public function setDatabase(\abstractDatabase $database) {
        $this->db=$database;
        return $this
}

или это должно быть записано как:

class Config
{
    public function setDatabase(\Database $database) {
        $this->db = $database;
        return $this;
}

Кроме того, при определении моего абстрактного класса я должен ссылаться на abstractClass или просто Class

abstract class Database
{
    abstract function __construct(\abstractConfig $config);
}

или

abstract class Database
{
    abstract function __construct(\Config $config);
}

Тот же вопрос касается реализации интерфейсов.

1 Ответ

0 голосов
/ 17 апреля 2020

Вы должны, если возможно, зависеть от абстракций, а не от конкрементов.

Это "D" SOLID принципов , а именно Принцип инверсии зависимостей .

Это позволяет вашей системе слабо соединяться и иметь возможность обмениваться участвующими модулями или классами, если они следуют соответствующей абстракции или интерфейсу.

Как реальная жизнь В примерах, следующих за вашим кодом, у вас может быть несколько ConfigInterface реализующих классы, которые читают конфигурацию из разных репозиториев и / или форматов, позволяя обменивать один класс на другой в соответствии с потребностями вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...