Метод может выполнять одно из двух действий:
- Команда — изменяет состояние объекта или системы.
- Запрос — возвращает данные.
Но он никогда не должен совмещать эти роли. Когда метод одновременно и изменяет состояние, и возвращает результат, это создаёт двусмысленность. Такой код сложнее читать, тестировать и предсказать его поведение.
Пример, который нарушает принцип:
// Плохо [✗]
function updateName(string $name): string {
// Обновляем значение в базе данных ...
return $this->name;
}На первый взгляд метод выглядит удобным, но он смешивает команду (updateName) и запрос (возврат string).
В результате становится неочевидно: вызываем мы его ради обновления данных или ради получения значения?
// Хорошо [✓]
function updateName(string $name): void {
// Обновляем значение в базе данных ...
}
function getUserName(): string {
return $this->name;
}Теперь всё прозрачно: один метод изменяет состояние, другой — возвращает данные.
Методы, которые возвращают $this, позволяют создавать цепочки вызовов (fluent-интерфейсы).
Это делает код декларативным, выразительным и более компактным:
// Хорошо [✓]
$user
->updateName('John')
->updateEmail('john@example.com')
->activate();Такой стиль повышает читаемость: мы видим не набор разрозненных вызовов, а последовательное описание намерений.