Как расширить существующую модель на PHP? Есть класс Message с заполненными данными. Title и Text.
Надо добавить метод getUrl, которое будет вычисляемое. Но не в данный класс а в другой. Что-то в роде MessageExtend который будет расширять класс Message.
Но вопрос в том что у меня есть в наличии только Message. Мне его надо каким-то образом преобразовать в MessageExtend с заполненными свойствами моего экземпляра. У меня тут затуп небольшой: как это делается по нормальному?
В одном месте у меня реализовано так: есть конструктор в классе MessageExtend в который передается Message, там циклом проходим по свойствам объекта и заполняем. В другом месте класс "сервис". Который просто принимает экземпляр объекта и уже с ним работает.
Как-то я этот момент упустил. Буду рад помощи.

21 Авг 2019 в 06:58
169 +1
0
Ответы
1

Есть несколько способов расширить существующую модель на PHP.

Наследование:
Можно создать новый класс MessageExtend, который будет наследоваться от класса Message. В новом классе можно добавить метод getUrl:class MessageExtend extends Message {
public function getUrl() {
// Вычисления URL
}
}Композиция:
Можно создать новый класс, который будет содержать экземпляр объекта Message и добавить новые методы:class MessageExtend {
private $message;
public function __construct(Message $message) {
$this->message = $message;
}
public function getUrl() {
// Вычисления URL
}
public function getTitle() {
return $this->message->getTitle();
}
public function getText() {
return $this->message->getText();
}
}Адаптер:
Можно использовать паттерн адаптер, который позволит преобразовать объект класса Message в объект класса MessageExtend:class MessageAdapter extends MessageExtend {
public function __construct(Message $message) {
$this->message = $message;
}
public function getUrl() {
// Вычисления URL
}
}Динамическое расширение:
Можно использовать магические методы в PHP, такие как __get, чтобы заполнять свойства объекта MessageExtend:class MessageExtend {
private $message;
public function __construct(Message $message) {
$this->message = $message;
}
public function __get($name) {
if ($name == 'url') {
// Вычисления URL
} else {
return $this->message->$name;
}
}
}

Выберите подход, который лучше всего подходит к вашему проекту и требованиям.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 795 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир