https://wiki.php.net/rfc/pipe-operator-v3
Команда Typhoon, в особенности Андрей Клименко, очень внимательно следила за этим RFC. Недавно о нём писали фартаны, теперь RFC принят, и я хочу разрешить ваш скепсис.
Вот вам реальный сниппет из исходников Хобота, который формирует и отправляет запрос в Т-Банк:
$normalizedMessage = $this->normalizer->normalize($message);
$requestData = $this->prepareRequestData($normalizedMessage);
$request = $this->buildRequest($endpoint, $requestData);
$response = $this->httpClient->request($request);
$responseBody = $response->getBody();
// Тут дальше логирование, проверка статус-кода и денормализация.
В целом, ок. Но хорошо было бы избавиться от промежуточных присваиваний, не вкладывая при этом вызовы друг в друга, чтобы не пострадала читабельность. Спасибо Ларри, в ноябре можно будет отрефакторить так:
$responseBody =
$this->normalizer->normalize($message)
|> $this->prepareRequestData(...)
|> fn (array $data): Request => $this->buildRequest($endpoint, $data)
|> $this->httpClient->request(...)
|> fn (Response $response) => $response->getBody()
;
Стало лучше? Спорно. Но этот RFC — лишь первый шаг Ларри в сторону реально крутых пайпов. Нам нужно изучить Future Scope, чтобы понять весь замысел.
Помечтаем. Ноябрь 2026, и я рефакторю код уже вот так:
$responseBody =
$this->normalizer->normalize($message)
|> $this->prepareRequestData(...)
|> $this->buildRequest($endpoint, ?)
|> $this->httpClient->request(...)
|> $$->getBody()
;
Теперь действительно выглядит круто. Разберёмся, что тут происходит.
? — это partial function application, как first class callable syntax (...), но с возможностью передать (применить) часть аргументов и выбрать вопросами параметры для результирующей функции:
$this->buildRequest($endpoint, ?)
// дешугарится в
fn (array $data): Request => $this->buildRequest($endpoint, $data)
Кстати, для PFA Ларри уже делал RFC 5 лет назад. Но тогда возникли трудности с реализацией и Никита Попов предложил
(...) в качестве более простой альтернативы. Теперь же потребность в ? сильно возросла и, я уверен, будет найдено решение.$$ — это, грубо говоря, "object application":
$$->getBody()
// дешугарится в
static fn ($object) => $object->getBody()
Этот RFC — большой шаг для развития функционального стиля в PHP. Уже сейчас проекты fp4php и Crell/fp начинают играть новыми красками, а с
? и $$ будет вообще кайф._______
Пссс, сегодня в