PHP: Реализация полей абстрактного класса

В проекте необходимо работать с денежными единицами. Изначально я использовал пакет MoneyPHP. Некоторые его функции оказались очень неудобными. Так или иначе я начал создавать к ним обертки и в какой-то момент понял, что обертки почти полностью заменяют сам пакет. В процессе их создания я неплохо так поупражнялся в ООП. Не долго думая, решил от пакета избавиться и дописать необходимые решения, создав тем самым свой полноценный сервис. Все очень удачно. Структура всплыла сама собой. Но возникла проблема.

При работе с денежными единицами необходимо указывать их валюту. В пакете MoneyPHP валюта выделяется в отдельную сущность (final class Currency). По сути, в себе она содержит только валютный код. В своем проекте я столкнулся с необходимостью использования минорных денежных единиц. То есть 1 рубль должен быть равен 100 копейкам. В пакете это реализовано, но реализовано криво. Объект валюты в себе не содержит данные о кратности. Пакет предлагает создавать денежную единицу, как:

$money = Money::RUB(100); // 1 RUB

Эта запись равносильна:

$currency = new Currency("RUB");
$money = new Money(100, $currency); // 1 RUB

Всё вроде бы хорошо и до поры удобно. Но... Проблема в том, что я каждый раз должен указывать размер создаваемой денежной единицы. То есть если я хочу получить 1 единицу любой валюты, то я должен знать размер её подвалюты и указать размер в ней. Я не могу просто прописать:

$money = Money::RUB;

И получить 1 рубль, равный 100 единицам. Это очень неудобно. Поэтому я решил сделать финальный класс "final class Currency" абстрактным классом "abstract Currency" и реализовывать его в конкретных классах-валютах. То есть вот так:

abstract class Currency implements CurrencyContract
{
    private string $code;
    private int $unit;

    ...
}

final class RUB extends Currency
{
    public const code = "RUB";
    public const unit = 100;
}

Проблема возникла в недостаточности знания языка. Я создал интерфейс, описывающий что должна делать валюта. Я описал что она должна иметь. Я создал реализующий её класс, содержащий значения конкретной валюты. Но проблема в том, что я не знаю как передать значения констант из реализующего класса в класс-родитель. Как мне передать мои const code и const unit из класса RUB в класс Currency чтоб записать их в $code и $unit?


Ответы (0 шт):