Pipe operator в PHP 8.6: практические примеры цепочек

Pipe operator в PHP 8.6: практические примеры цепочек

Оператор pipe (|>) был добавлен в PHP 8.5 (выпущен 20 ноября 2025 года). В PHP 8.6 (ожидается в конце 2026 года) добавлена partial function application (PFA) с использованием ? как плейсхолдера, что идеально дополняет pipe и позволяет элегантно работать с функциями, имеющими несколько аргументов.

Синтаксис:

выражение |> callable |> другой_callable

Результат левой части передаётся как первый аргумент в callable справа.

Ограничения:

  • Callable должен принимать аргумент по значению (не по ссылке).
  • Для функций с более чем одним аргументом в PHP 8.5 требуется замыкание или arrow-функция.
  • Arrow-функции в цепочке нужно обернуть в скобки ().
  • В PHP 8.6 с PFA это решается проще с помощью ?.

Примеры использования

Простой пример: обработка строки

// PHP 8.4 и ниже
$input = "  Hello World  ";
$result = strtoupper(trim(str_replace('World', 'PHP', $input)));
echo $result; // HELLO PHP

// PHP 8.5 с pipe
$input = "  Hello World  "
    |> trim(...)
    |> str_replace('World', 'PHP', ...)
    |> strtoupper(...);

echo $result; // HELLO PHP

Пример с array: фильтрация и трансформация

$users = ['alice', 'bob', 'charlie', 'dave'];

$filtered = $users
    |> array_filter(fn($name) => strlen($name) > 3)
    |> array_map(fn($name) => ucfirst($name))
    |> array_values(...); // сброс ключей

print_r($filtered);
// Array ( [0] => Alice [1] => Charlie [2] => Dave )

Пример с partial application (уже в PHP 8.5, но лучше в 8.6)

// PHP 8.5: замыкание
$input = "hello"
    |> fn($s) => str_replace('hello', 'hi', $s)
    |> ucfirst(...);

// PHP 8.6 (PFA): гораздо чище
$input = "hello"
    |> str_replace('hello', 'hi', ?)
    |> ucfirst(...);

Реальный пример: обработка URL

$url = "https://example.com/path?query=1"
    |> parse_url(...)
    |> fn($parts) => $parts['host'] ?? 'localhost'
    |> str_replace('example.com', 'new-domain.com', ?);

echo $url; // new-domain.com

Пример с объектами и методами

$result = new SomeCollection()
    |> $this->filter(...)
    |> $this->map(...)
    |> $this->reduce(..., 0);

Ещё один: обработка JSON

$json = '{"name": "Alice", "age": 30}'
    |> json_decode(...)
    |> fn($data) => $data->name . ' is ' . $data->age
    |> strtoupper(...);

echo $json; // ALICE IS 30

Преимущества

  • Высокая читаемость: код "течёт" сверху вниз или слева направо, как в Unix-пайпах ().
  • Отсутствие промежуточных переменных.
  • Оптимизации на уровне компилятора (особенно в сочетании с PFA).
  • Отлично подходит для функционального стиля программирования.

Когда использовать

  • Обработка строк, массивов, данных из API.
  • Конвейерные операции: валидация → трансформация → сохранение.
  • Замена вложенных вызовов функций и временных переменных в сложных выражениях.

С выходом PHP 8.6 комбинация pipe + PFA сделает такие цепочки ещё чище и выразительнее. Рекомендую обновляться на 8.5 уже сейчас, а 8.6 ждём с нетерпением!