Состояние
Оригинальное название: 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(), и невозможные переходы отсекаются в одном месте, а не проверками, разбросанными по коду.
Как держать состояние под контролем
- Хранить его в одном месте, а не копировать в нескольких.
- Ограничивать, кто может его менять: закрытые свойства, методы с проверками.
- Предпочитать неизменяемые объекты там, где значения не должны меняться.
- Помнить о кеше: закешированная страница — тоже состояние, и после изменения данных её нужно сбросить.
Подход, который максимально избегает изменяемого состояния, развивает функциональное программирование.

