php enum без абстрактного класса

83
05 марта 2022, 21:10

подскажите пожалуйста, чем плохо сделать так

class Enum{
  public static $view = 'view';
  public static $delete = 'delete';
  public static $add = 'add';
}
 $action = Enum::$view;
 echo $action;

почему https://github.com/myclabs/php-enum вот здесь используется абстрактный класс?

Answer 1

Всегда лучше работать с объектами чем со строками(как в вашем случае).

Вот почему:

Доступны все возможности ООП - инкапсуляция, наследование, полиморфизм, а в случае использования класса с публичными статическими свойствами - нет.

При передаче в коде, вы гарантируете, что это именно нужный экземпляр, а не просто строка:

public function getContent(ViewEnum $enum)

VS

public function getContent(string $enum)

Используя это решение вы получаете дополнительную функциональность, например isValid метод который помогает проверить корректность значения. Вы можете унаследоваться и добавить свою функциональность.

Вот примеры нескольких задач для сравнения:

Получить массив всех значений списка:

В вашем случае:

$result = [Enum::$view, Enum::$view, Enum::$view];

В случае php-enum:

$result = Enum::toArray();

Проверить, что пришло корректное значение:

В вашем случае

in_array($value, [Enum::$view, Enum::$delete, Enum::$add]);

В случае php-enum:

$result = Enum::isValid($value);

Проверить, что полученное значение, равняется delete

В вашем случае:

$value === Enum::$delete

В случае php-enum:

$value->equals(Enum::DELETE()) 

или

$value->isDelete() 

если добавить соответствующий метод.

READ ALSO
Валидация времени ларавел

Валидация времени ларавел

Как сделать валидацию времени типа H:i ?

137
Отменить сохранение записи save_post

Отменить сохранение записи save_post

Как отменить обновление записи, если валидация не прошла? Допустим нужно отредактировать заказ woocommerce или запись блога, использую такой код:

79
проверить существует ли файл?

проверить существует ли файл?

как из массива со списком расширениями проверить существует ли файл?

113
SELECT YII2 WHERE IN

SELECT YII2 WHERE IN

Подскажите почему выборка срабатывает и показывает только одну запись

118