Comments 12
Классная статья, прям то, чего не хватало по пайпам в новой версии пыхи. Не просто «вот новый синтаксис», а с акцентом на подводные камни и реальные ограничения, из-за которых легко наломать дров в проде. Нравится, что ты не агитируешь «тащить pipe везде», а честно пишешь, где он ухудшает читаемость и когда без замыканий лучше не лезть. Одним словом контент топ, давай еще статей)
Вот только узнавать всё лучше в официальной документации.
А тут все примеры нерабочие, в вызове функций должен стоять spread-оператор.
$ php -r '$size = "Welcome to PHP!" |> strlen(); print $size;'
PHP Fatal error: Uncaught ArgumentCountError: strlen() expects exactly 1 argument, 0 given in Command line code:1
$ php -r '$size = "Welcome to PHP!" |> strlen(...); print $size;'
15
Ну и якобы ошибки:
1, 3, 4 - пропущен spread. Если его поставить, то всё работает без дополнительного оборачивания в лямбду;
2 - у preg_match два обязательных аргумента, а в пайпе разрешены только функции с одним обязательным аргументом.
Честно говоря по ошибкам ничего не понятно, то ли примеры кривые, то ли комментарии.
$value |> decodeJson(); // Ошибка: Too many arguments
$value |> (fn($x) => decodeJson($x)); // решение
В чем решение, если внутри все также передаем в функцию атрибут? Записи равнозначны и ошибка должна быть такой же. К тому же если функция не принимает атрибутов - в чем смысл использовать с ней пайп?
$user |> $service->process(); // PHP интерпретирует как $service->process($user)
В комментарии ожидаемое на первый взгляд поведение, но это неверно же. PHP сначала выполнит $service->process(); и дальше либо упадет из-за не переданного обязательного аргумента, либо упадет из-за того что process не вернул callable с 1 аргументом, либо отработает, если результат process() - callable с единственным обязательным аргументом.
$data |>newDTO(); // PHP вызовет new DTO($data)
Это вариация прошлой ошибки, но PHP вызовет new DTO() - без передачи аргумента.
Сильно сбивает с толку.
Данные примеры из реальной жизни.
Это предостережения для вас читателей.
Как лучше не стоит не делать.
Код в данных участках сильно подвержен изменениям.
Скорее всего в какой-то момент расширится конструктор или набор входных аргументов.
Что в будущем может спровоцировать ошибки.
Именно в таких местах: конструкторы, методы объекта, наши кастомные функции.
Поэтому pipe лучше следует применять к функциям, которые "редко меняются" или по умолчанию просто оборачивать в анонимные функции, чтобы не спровоцировать ошибки
Тут вся статья кривая. Если сделать как полагается, то всё работает без лямбд,
$value |> decodeJson(...);
$user |> $service->process(...);
$data |> new DTO(...);
Реально кривая статья. ИИ что ли писал? Как верно заметили выше, вместо обёрток надо использовать создание замыканий через многоточие.
Кстати, теперь у нас есть ещё и функция clone:php -r 'var_dump((object) [] |> clone(...));'
object(stdClass)#2 (0) {
}
clone был и раньше. Сейчас его расширили, добавив второй параметр - ассоциативный массив со свойствами, которые будут изменены в копии. Это позволяет менять readonly-свойства при копировании.
Не используйте pipe operator в PHP 8.5, пока не узнали все нюансы