Состояние

Оригинальное название: state

Коротко

Данные, которые программа помнит в конкретный момент и от которых зависит её дальнейшее поведение: авторизован ли пользователь, что в корзине, на каком шаге форма.

Что такое «Состояние»

Одна и та же кнопка «Оформить заказ» ведёт себя по-разному в зависимости от того, пуста ли корзина и вошёл ли покупатель. Всё, что влияет на такое поведение и меняется со временем, — это состояние. Оно хранится в переменных и объектах, в базе данных, в сессии пользователя, в cookie и localStorage браузера.

Состояние делает программы полезными: без него сайт не помнил бы ни заказов, ни пользователей. Но оно же — главный источник сложных ошибок. Когда результат функции зависит не только от её аргументов, но и от того, что произошло раньше, воспроизвести и понять сбой гораздо труднее.

С состоянием и без

Протокол HTTP не хранит состояние между запросами, и это сознательное решение. Сервер, который ничего не помнит о прошлых запросах, легко масштабировать: любой из нескольких серверов может обработать любой запрос. Поэтому состояние выносят в общее хранилище — базу или Redis, — а сами PHP-процессы оставляют без памяти о прошлом. В интерфейсах наоборот: фреймворки вроде React строятся вокруг явного состояния компонентов и перерисовывают страницу при его изменении.

Пример: статусы заказа как конечный автомат

Частый источник ошибок — переходы в недопустимое состояние, например возврат денег за неоплаченный заказ. Помогает явная таблица разрешённых переходов:

const TRANSITIONS = [
    'new'     => ['paid', 'cancelled'],
    'paid'    => ['shipped', 'refunded'],
    'shipped' => ['delivered'],
];

function canMove(string $from, string $to): bool
{
    return in_array($to, TRANSITIONS[$from] ?? [], true);
}

Любая смена статуса проходит через canMove(), и невозможные переходы отсекаются в одном месте, а не проверками, разбросанными по коду.

Как держать состояние под контролем

  • Хранить его в одном месте, а не копировать в нескольких.
  • Ограничивать, кто может его менять: закрытые свойства, методы с проверками.
  • Предпочитать неизменяемые объекты там, где значения не должны меняться.
  • Помнить о кеше: закешированная страница — тоже состояние, и после изменения данных её нужно сбросить.

Подход, который максимально избегает изменяемого состояния, развивает функциональное программирование.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение