@lexstile

Как использовать uinion type для конкретных значений?

Есть метод для проверки типа платежа:
public function isPaymentType($type) {
        return $this->payment_type === $type;
    }

Я хочу задать типы для 2 конкретных значений, а именно:
class PaymentType
{
  const CASH = 1;
  const NON_CASH = 2;
}

Как сделать, чтобы $type был PaymentType::CASH или PaymentType::NON_CASH, и никак больше, без использования ENUM?

Либо через generic, тоже подойдет, но не понял, как связать именно только с 2-мя конкретными значениями.
  • Вопрос задан
  • 59 просмотров
Решения вопроса 3
@humoured
Вы всё на свете найдёте в коробке с карандашами
Как сделать Enum без Enum? Никак. Проверяйте получаемое значение каждый раз через какую-нибудь функцию PaymentType::validate($value).
Можно сделать абстрактный класс для таких псевдо-enum'ов, в котором реализовать эту функцию через Reflection с автоматическим анализом существующих констант.
Ответ написан
Комментировать
REZ1DENT3
@REZ1DENT3
web-developer
используй стат. анализ и запускай его в pipeline )
пример для phpstan (see https://phpstan.org/writing-php-code/phpdoc-types#...)
/**
 * @param PaymentType::* $type
 */
public function isPaymentType($type) {
    return $this->payment_type === $type;
}
Ответ написан
Комментировать
Если enum недоступен - можно написать ValueObject который будет его симулировать.

Пример реализации

class PaymentType
{
    private const CASH = 1;
    private const NON_CASH = 2;

    private int $type;

    private function __construct(int $type)
    {
        $this->type = $type;
    }

    public static function cash(): self
    {
        return new self(self::CASH);
    }

    public static function nonCash(): self
    {
        return new self(self::NON_CASH);
    }

    public function isCash(): bool
    {
        return $this->type === self::CASH;
    }

    public function isNonCash(): bool
    {
        return $this->type === self::NON_CASH;
    }
}

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы