php ENUM

smartenumПри разработке приложений на связке 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. При необходимости его можно расширить для сравнения статусов – больше/меньше и т.д.

  • 06.02.2011
  • php
  • Artem

    Зачем отдельно такой ксласс создавать? я бы весь этот код написал бы сразу в моделе Order. не разу такой подход не подводил