Страницы

Поиск по вопросам

суббота, 22 июня 2019 г.

Вызов метода одного класса из другого

Есть класс для работы с IMAP протоколом. Назовем его class1 А так же есть класс для работы с сокетами. Назовем его class2 Я хочу из class1 дергать методы class2. Нужно все два метода - socketRequest($socketRequest) и socketResponse(). Т.е отправить запрос и принять ответ. Как реализовать подобное?
Идея 1: передать в конструктор class1 объект class2 и потом уже вызывать нужные методы. Но тогда получается, что классы жестко связаны.
Идея 2: В class2 реализовать __invoke($socketRequest). Далее как так же передаю объект class2 в class1, но в отличие от первой идеи, я не вызываю конкретные методы а сам объект использую как функцию - class2($imapRequest). Т.е привязки сильной нету, можно потом будет подсунуть все что хочешь. Какие идеи?


Ответ

Вашу задачу можно решить с помощью одного из следующих типов отношений - агрегация, либо композиция
Агрегация – применяется когда один класс должен быть контейнером других классов. Причем время существования содержащихся классов никак не зависит от времени существования класса контейнера.
пример:
class class2 { public function socketRequest($socketRequest) { // } public function socketResponse() { // } }
class class1 { private $foo;
public function __constructor(class2 $Foo) { $this->foo = $Foo; }
public function socketRequest($socketRequest) { return $this->foo->socketRequest($socketRequest); } public function socketResponse() { return $this->foo->socketResponse(); } }
Если в ходе выполнения программы объект class1 будет уничтожен, это никак не повлияет на объект класса class2
Композиция более строгий вариант отношений. В отличии от агрегации, композиция имеет жёсткую зависимость времени существования экземпляров класса контейнера и экземпляров содержащихся классов.
пример:
class class2 { public function socketRequest($socketRequest) { // } public function socketResponse() { // } }
class class1 { private $foo;
public function __constructor() { $this->foo = new class2; }
public function socketRequest($socketRequest) { return $this->foo->socketRequest($socketRequest); } public function socketResponse() { return $this->foo->socketResponse(); } }
Если в ходе выполнения программы объект class1 будет уничтожен, это повлечет за собой уничтожение объекта класса class2
Чтобы определить какой тип отношений Вам подходит нужно ответить на вопрос должен ли класс class2 существовать вне класа class1. Если class2 планируется использовать где то еще - используйте агрегацию, если нет - композицию.

Комментариев нет:

Отправить комментарий