php ENUM
При разработке приложений на связке PHP+MySql часто приходится использовать поля типа ENUM. Данный тип поля предназначен для создания списка из допустимых значений, которые перечислены спецификации столбца. Стоит отметить, что в базе поле с перечислением хранится как число, что обеспечивает высокую скорость работы.
При взаимодействии с такими полями на php, обычно используют строковое присваивание значения. Минус данного метода, очевиден — если допустить банальную опечатку, то в поле будет записано пустое значение. Если название значения в базе необходимо поменять, но придется по всему проекту делать замену.
К сожалению, в php не имеется встроенной возможности создания перечислений, как, например. в C#. Выходом из ситуации является решение на псевдо-enum классах.
Общий интерфейс выглядит так:
interface IEnum { /** * @return array всех значений как ключ массива, название как значение */ static function items(); /** * Проверка корректности значения * @return bool */ static function isValid($value); }
Пример класса реализующего данный интерфейс:
/** * Статусы заказа */ class OrderStatus implements IEnum { /** * Черновик * @var string */ const DRAFT = 'draft'; /** * На модерации * @var string */ const CHEKING = 'cheking'; /** * В работе * @var string */ const WORKING = 'working'; /** * Завершен * @var string */ const COMPLETED = 'completed'; /** * Отменен * @var string */ const CANCELED = 'canceled'; /** * @return array статусов заказа ключ => название */ public static function items() { return array( self::DRAFT => 'Черновик', self::CHEKING => 'Ожидает обработки', self::WORKING => 'В работе', self::COMPLETED => 'Завершен', self::CANCELED => 'Отменен', ); } /** * Проверка статуса на валидность * * @param string $status * @return bool */ public static function isValid($status) { return in_array($status, array_keys(self::items())); } }
Такой несложный класс значительно упрощает работу со перечислениями mysql. При необходимости его можно расширить для сравнения статусов – больше/меньше и т.д.