Как решить зависимость класса от другого класса?

Ссылка скопирована
1 ответ

Есть 2 класса, Tools и Config.
Классу Config нужно api COLORS из класса Tools, классу Tools нужно api ARGUMENTS из Config.

Как поступить? Я уже на setter/getter посматриваю, но пока ничего толкового не придумал. Может фасад заюзать?

const config = new Config(new Tools(this)); const tools = new Tools(config);

const config = new Config(new Tools(this)); const tools = new Tools(config);

Дополнительно:

Может какой-то Dependency Injection?)

Вообще, если у вас два класса столь "плотно" зависят друг от друга, значит их общую зависимость нужно вынести в другой класс

У вас циклическая зависимость. Это первейший признак того, что вы что-то неправильно спроектировали. Выносите функционал, используемый обоими классами, в третий класс. Тогда вы избавитесь от циклической зависимости.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для решения зависимости класса от другого класса в PHP можно использовать паттерн Dependency Injection (внедрение зависимостей). Этот подход позволяет передавать зависимости классу через конструктор или метод, что делает класс более гибким и упрощает тестирование.

Прежде всего, необходимо определить интерфейс для взаимодействия с зависимым классом. Это позволит заменить конкретную реализацию зависимости на другую без изменения основного класса. Создадим интерфейс:

interface DependencyInterface {
    public function doSomething();
}

interface DependencyInterface { public function doSomething(); }

Затем создадим класс, который зависит от другого класса через инъекцию зависимости:

class MainClass {
    private $dependency;
 
    public function __construct(DependencyInterface $dependency) {
        $this->dependency = $dependency;
    }
 
    public function performAction() {
        $this->dependency->doSomething();
    }
}

class MainClass { private $dependency; public function __construct(DependencyInterface $dependency) { $this->dependency = $dependency; } public function performAction() { $this->dependency->doSomething(); } }

Теперь создадим конкретную реализацию зависимости:

class Dependency implements DependencyInterface {
    public function doSomething() {
        // Реализация метода
    }
}

class Dependency implements DependencyInterface { public function doSomething() { // Реализация метода } }

Используя Dependency Injection, мы можем передать экземпляр зависимости в конструктор главного класса:

$dependency = new Dependency();
$mainClass = new MainClass($dependency);
$mainClass->performAction();

$dependency = new Dependency(); $mainClass = new MainClass($dependency); $mainClass->performAction();

Таким образом, мы убрали прямую зависимость класса MainClass от класса Dependency, что делает код более гибким и упрощает его тестирование. В случае необходимости замены зависимости, достаточно создать новую реализацию интерфейса и передать её в конструктор главного класса.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно