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

21 Авг 2019 в 06:58
214 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир